00001 /* 00002 * 00003 * Copyright (C) 1994-2004, OFFIS 00004 * 00005 * This software and supporting documentation were developed by 00006 * 00007 * Kuratorium OFFIS e.V. 00008 * Healthcare Information and Communication Systems 00009 * Escherweg 2 00010 * D-26121 Oldenburg, Germany 00011 * 00012 * THIS SOFTWARE IS MADE AVAILABLE, AS IS, AND OFFIS MAKES NO WARRANTY 00013 * REGARDING THE SOFTWARE, ITS PERFORMANCE, ITS MERCHANTABILITY OR 00014 * FITNESS FOR ANY PARTICULAR USE, FREEDOM FROM ANY COMPUTER DISEASES OR 00015 * ITS CONFORMITY TO ANY SPECIFICATION. THE ENTIRE RISK AS TO QUALITY AND 00016 * PERFORMANCE OF THE SOFTWARE IS WITH THE USER. 00017 * 00018 * Module: dcmdata 00019 * 00020 * Author: Gerd Ehlers 00021 * 00022 * Purpose: Interface of class DcmItem 00023 * 00024 * Last Update: $Author: joergr $ 00025 * Update Date: $Date: 2004/02/04 16:02:08 $ 00026 * CVS/RCS Revision: $Revision: 1.49 $ 00027 * Status: $State: Exp $ 00028 * 00029 * CVS/RCS Log at end of file 00030 * 00031 */ 00032 00033 00034 #ifndef DCITEM_H 00035 #define DCITEM_H 00036 00037 #include "osconfig.h" /* make sure OS specific configuration is included first */ 00038 00039 #include "ofconsol.h" 00040 #include "dctypes.h" 00041 #include "dcobject.h" 00042 #include "dcvrui.h" 00043 #include "dclist.h" 00044 #include "dcstack.h" 00045 #include "dcpcache.h" 00046 00047 00048 // forward declaration 00049 class DcmSequenceOfItems; 00050 00051 00054 class DcmItem 00055 : public DcmObject 00056 { 00057 00058 public: 00059 00062 DcmItem(); 00063 00069 DcmItem(const DcmTag &tag, 00070 const Uint32 len = 0); 00071 00075 DcmItem(const DcmItem &old); 00076 00079 virtual ~DcmItem(); 00080 00084 virtual DcmEVR ident() const; 00085 00089 virtual unsigned long getVM(); 00090 00091 virtual unsigned long card() const; 00092 00093 virtual OFBool isLeaf() const { return OFFalse; } 00094 00102 virtual void print(ostream &out, 00103 const size_t flags = 0, 00104 const int level = 0, 00105 const char *pixelFileName = NULL, 00106 size_t *pixelCounter = NULL); 00107 00108 virtual Uint32 calcElementLength(const E_TransferSyntax xfer, 00109 const E_EncodingType enctype); 00110 00111 virtual Uint32 getLength(const E_TransferSyntax xfer = EXS_LittleEndianImplicit, 00112 const E_EncodingType enctype = EET_UndefinedLength); 00113 00114 virtual void transferInit(); 00115 virtual void transferEnd(); 00116 00117 virtual OFBool canWriteXfer(const E_TransferSyntax newXfer, 00118 const E_TransferSyntax oldXfer); 00119 00133 virtual OFCondition read(DcmInputStream &inStream, 00134 const E_TransferSyntax ixfer, 00135 const E_GrpLenEncoding glenc = EGL_noChange, 00136 const Uint32 maxReadLength = DCM_MaxReadLength); 00137 00144 virtual OFCondition write(DcmOutputStream &outStream, 00145 const E_TransferSyntax oxfer, 00146 const E_EncodingType enctype = EET_UndefinedLength); 00147 00153 virtual OFCondition writeXML(ostream &out, 00154 const size_t flags = 0); 00155 00162 virtual OFCondition writeSignatureFormat(DcmOutputStream &outStream, 00163 const E_TransferSyntax oxfer, 00164 const E_EncodingType enctype = EET_UndefinedLength); 00165 00169 virtual OFBool containsUnknownVR() const; 00170 00183 virtual OFCondition insert(DcmElement *elem, 00184 OFBool replaceOld = OFFalse, 00185 OFBool checkInsertOrder = OFFalse); 00186 00187 virtual DcmElement *getElement(const unsigned long num); 00188 00189 // get next Object from position in stack. If stack empty 00190 // get next Object in this item. if intoSub true, scan 00191 // complete hierarchy, false scan only elements direct in this 00192 // item (not deeper). 00193 virtual OFCondition nextObject(DcmStack &stack, 00194 const OFBool intoSub); 00195 virtual DcmObject *nextInContainer(const DcmObject *obj); 00196 virtual DcmElement *remove(const unsigned long num); 00197 virtual DcmElement *remove(DcmObject *elem); 00198 virtual DcmElement *remove(const DcmTagKey &tag); 00199 virtual OFCondition clear(); 00200 virtual OFCondition verify(const OFBool autocorrect = OFFalse ); 00201 virtual OFCondition search(const DcmTagKey &xtag, // in 00202 DcmStack &resultStack, // inout 00203 E_SearchMode mode = ESM_fromHere, // in 00204 OFBool searchIntoSub = OFTrue ); // in 00205 virtual OFCondition searchErrors( DcmStack &resultStack ); // inout 00206 virtual OFCondition loadAllDataIntoMemory(); 00207 00236 virtual OFCondition computeGroupLengthAndPadding(const E_GrpLenEncoding glenc, 00237 const E_PaddingEncoding padenc = EPD_noChange, 00238 const E_TransferSyntax xfer = EXS_Unknown, 00239 const E_EncodingType enctype = EET_ExplicitLength, 00240 const Uint32 padlen = 0, 00241 const Uint32 subPadlen = 0, 00242 Uint32 instanceLength = 0); 00243 00244 /* simple tests for existance */ 00245 OFBool tagExists(const DcmTagKey &key, 00246 OFBool searchIntoSub = OFFalse); 00247 OFBool tagExistsWithValue(const DcmTagKey &key, 00248 OFBool searchIntoSub = OFFalse); 00249 00250 00251 /* --- findAndGet functions: find an element and get it or the value, respectively --- */ 00252 00261 OFCondition findAndGetElement(const DcmTagKey &tagKey, 00262 DcmElement *&element, 00263 const OFBool searchIntoSub = OFFalse); 00264 00272 OFCondition findAndGetElements(const DcmTagKey &tagKey, 00273 DcmStack &resultStack); 00274 00285 OFCondition findAndGetString(const DcmTagKey &tagKey, 00286 const char *&value, 00287 const OFBool searchIntoSub = OFFalse); 00288 00305 OFCondition findAndGetOFString(const DcmTagKey &tagKey, 00306 OFString &value, 00307 const unsigned long pos = 0, 00308 const OFBool searchIntoSub = OFFalse); 00309 00323 OFCondition findAndGetOFStringArray(const DcmTagKey &tagKey, 00324 OFString &value, 00325 const OFBool searchIntoSub = OFFalse); 00326 00336 OFCondition findAndGetUint8(const DcmTagKey &tagKey, 00337 Uint8 &value, 00338 const unsigned long pos = 0, 00339 const OFBool searchIntoSub = OFFalse); 00340 00350 OFCondition findAndGetUint8Array(const DcmTagKey &tagKey, 00351 const Uint8 *&value, 00352 unsigned long *count = NULL, 00353 const OFBool searchIntoSub = OFFalse); 00354 00364 OFCondition findAndGetUint16(const DcmTagKey &tagKey, 00365 Uint16 &value, 00366 const unsigned long pos = 0, 00367 const OFBool searchIntoSub = OFFalse); 00368 00378 OFCondition findAndGetUint16Array(const DcmTagKey &tagKey, 00379 const Uint16 *&value, 00380 unsigned long *count = NULL, 00381 const OFBool searchIntoSub = OFFalse); 00382 00392 OFCondition findAndGetSint16(const DcmTagKey &tagKey, 00393 Sint16 &value, 00394 const unsigned long pos = 0, 00395 const OFBool searchIntoSub = OFFalse); 00396 00406 OFCondition findAndGetSint16Array(const DcmTagKey &tagKey, 00407 const Sint16 *&value, 00408 unsigned long *count = NULL, 00409 const OFBool searchIntoSub = OFFalse); 00410 00420 OFCondition findAndGetUint32(const DcmTagKey &tagKey, 00421 Uint32 &value, 00422 const unsigned long pos = 0, 00423 const OFBool searchIntoSub = OFFalse); 00424 00434 OFCondition findAndGetUint32Array(const DcmTagKey &tagKey, 00435 const Uint32 *&value, 00436 unsigned long *count = NULL, 00437 const OFBool searchIntoSub = OFFalse); 00438 00448 OFCondition findAndGetSint32(const DcmTagKey &tagKey, 00449 Sint32 &value, 00450 const unsigned long pos = 0, 00451 const OFBool searchIntoSub = OFFalse); 00452 00462 OFCondition findAndGetSint32Array(const DcmTagKey &tagKey, 00463 const Sint32 *&value, 00464 unsigned long *count = NULL, 00465 const OFBool searchIntoSub = OFFalse); 00466 00476 OFCondition findAndGetLongInt(const DcmTagKey &tagKey, 00477 long int &value, 00478 const unsigned long pos = 0, 00479 const OFBool searchIntoSub = OFFalse); 00480 00490 OFCondition findAndGetFloat32(const DcmTagKey &tagKey, 00491 Float32 &value, 00492 const unsigned long pos = 0, 00493 const OFBool searchIntoSub = OFFalse); 00494 00504 OFCondition findAndGetFloat32Array(const DcmTagKey &tagKey, 00505 const Float32 *&value, 00506 unsigned long *count = NULL, 00507 const OFBool searchIntoSub = OFFalse); 00508 00518 OFCondition findAndGetFloat64(const DcmTagKey &tagKey, 00519 Float64 &value, 00520 const unsigned long pos = 0, 00521 const OFBool searchIntoSub = OFFalse); 00522 00532 OFCondition findAndGetFloat64Array(const DcmTagKey &tagKey, 00533 const Float64 *&value, 00534 unsigned long *count = NULL, 00535 const OFBool searchIntoSub = OFFalse); 00536 00546 OFCondition findAndGetSequence(const DcmTagKey &seqTagKey, 00547 DcmSequenceOfItems *&sequence, 00548 const OFBool searchIntoSub = OFFalse); 00549 00560 OFCondition findAndGetSequenceItem(const DcmTagKey &seqTagKey, 00561 DcmItem *&item, 00562 const signed long itemNum = 0); 00563 00564 00565 /* --- findOrCreate functions: find an element or create a new one --- */ 00566 00579 OFCondition findOrCreateSequenceItem(const DcmTag &seqTag, 00580 DcmItem *&item, 00581 const signed long itemNum = 0); 00582 00583 00584 /* --- findAndXXX functions: find an element and do something with it --- */ 00585 00594 OFCondition findAndDeleteElement(const DcmTagKey &tagKey, 00595 const OFBool allOccurrences = OFFalse, 00596 const OFBool searchIntoSub = OFFalse); 00597 00607 OFCondition findAndCopyElement(const DcmTagKey &tagKey, 00608 DcmElement *&newElement, 00609 const OFBool searchIntoSub = OFFalse); 00610 00611 /* --- putAndInsert functions: put value and insert new element --- */ 00612 00621 OFCondition putAndInsertString(const DcmTag &tag, 00622 const char *value, 00623 const OFBool replaceOld = OFTrue); 00624 00632 OFCondition putAndInsertOFStringArray(const DcmTag &tag, 00633 const OFString &value, 00634 const OFBool replaceOld = OFTrue); 00635 00644 OFCondition putAndInsertUint8Array(const DcmTag &tag, 00645 const Uint8 *value, 00646 const unsigned long count, 00647 const OFBool replaceOld = OFTrue); 00648 00657 OFCondition putAndInsertUint16(const DcmTag &tag, 00658 const Uint16 value, 00659 const unsigned long pos = 0, 00660 const OFBool replaceOld = OFTrue); 00661 00670 OFCondition putAndInsertUint16Array(const DcmTag &tag, 00671 const Uint16 *value, 00672 const unsigned long count, 00673 const OFBool replaceOld = OFTrue); 00674 00683 OFCondition putAndInsertSint16(const DcmTag &tag, 00684 const Sint16 value, 00685 const unsigned long pos = 0, 00686 const OFBool replaceOld = OFTrue); 00687 00696 OFCondition putAndInsertSint16Array(const DcmTag &tag, 00697 const Sint16 *value, 00698 const unsigned long count, 00699 const OFBool replaceOld = OFTrue); 00700 00709 OFCondition putAndInsertUint32(const DcmTag &tag, 00710 const Uint32 value, 00711 const unsigned long pos = 0, 00712 const OFBool replaceOld = OFTrue); 00713 00722 OFCondition putAndInsertSint32(const DcmTag &tag, 00723 const Sint32 value, 00724 const unsigned long pos = 0, 00725 const OFBool replaceOld = OFTrue); 00726 00735 OFCondition putAndInsertFloat32(const DcmTag &tag, 00736 const Float32 value, 00737 const unsigned long pos = 0, 00738 const OFBool replaceOld = OFTrue); 00739 00748 OFCondition putAndInsertFloat64(const DcmTag &tag, 00749 const Float64 value, 00750 const unsigned long pos = 0, 00751 const OFBool replaceOld = OFTrue); 00752 00760 OFCondition insertEmptyElement(const DcmTag &tag, 00761 const OFBool replaceOld = OFTrue); 00762 00763 00764 protected: 00765 00767 DcmList *elementList; 00768 00773 OFBool lastElementComplete; 00774 00779 Uint32 fStartPosition; 00780 00799 OFCondition readTagAndLength(DcmInputStream &inStream, // inout 00800 const E_TransferSyntax xfer, // in 00801 DcmTag &tag, // out 00802 Uint32 &length, // out 00803 Uint32 &bytesRead); // out 00804 00821 OFCondition readSubElement(DcmInputStream &inStream, // inout 00822 DcmTag &newTag, // inout 00823 const Uint32 newLength, // in 00824 const E_TransferSyntax xfer, // in 00825 const E_GrpLenEncoding glenc, // in 00826 const Uint32 maxReadLength = DCM_MaxReadLength); 00827 00837 E_TransferSyntax checkTransferSyntax(DcmInputStream &inStream); 00838 00839 00840 private: 00841 00843 DcmItem &operator=(const DcmItem &); 00844 00845 DcmObject* copyDcmObject(DcmObject *oldObj); 00846 00847 OFCondition searchSubFromHere(const DcmTagKey &tag, // in 00848 DcmStack &resultStack, // inout 00849 OFBool searchIntoSub ); // in 00850 00851 OFBool foundVR(char *atposition); 00852 00854 DcmPrivateTagCache privateCreatorCache; 00855 }; 00856 00857 00858 // 00859 // SUPPORT FUNCTIONS 00860 // 00861 00862 00863 // Function: newDicomElement 00864 // creates a new DicomElement from a Tag. 00865 // 00866 // Input: 00867 // tag : Tag of the new element 00868 // length : length of the element value 00869 // 00870 // Output: 00871 // newElement: point of a heap allocated new element. If the tag does not 00872 // describe a dicom element or has ambigious VR (e.g. EVR_ox) 00873 // a NULL pointer is returned. 00874 // 00875 // Result: 00876 // EC_Normal: tag describes an element (possibly with ambiguous VR) 00877 // EC_InvalidTag: tag describes an item begin or an unknown element 00878 // EC_SequEnd: tag describes a sequence delimitation element 00879 // EC_ItemEnd: tag describes an item delmitation element 00880 // other: an error 00881 OFCondition newDicomElement(DcmElement *&newElement, 00882 const DcmTag &tag, 00883 const Uint32 length = 0); 00884 00885 00886 00887 // Functions: newDicomElement 00888 // creates a new DicomElement from a Tag. They differ from the above functions 00889 // in not returning a condition. 00890 DcmElement *newDicomElement(const DcmTag &tag, 00891 const Uint32 length = 0); 00892 00893 // Function: nextUp 00894 // pop Object from stack and get next Object in top of stack 00895 OFCondition nextUp(DcmStack &st); 00896 00897 00898 #endif // DCITEM_H 00899 00900 00901 /* 00902 ** CVS/RCS Log: 00903 ** $Log: dcitem.h,v $ 00904 ** Revision 1.49 2004/02/04 16:02:08 joergr 00905 ** Removed pointer declaration from parameter "resultStack" in method 00906 ** findAndGetElements(). 00907 ** 00908 ** Revision 1.48 2003/10/08 10:24:40 joergr 00909 ** Added support for AT, OB, OF, OW, SL, SS, UL, US to putAndInsertString(). 00910 ** 00911 ** Revision 1.47 2003/07/16 14:34:05 joergr 00912 ** Added new function findAndGetSequence(). 00913 ** 00914 ** Revision 1.46 2003/06/26 09:17:25 onken 00915 ** Added commandline-application dcmodify. 00916 ** 00917 ** Revision 1.45 2003/06/12 13:33:46 joergr 00918 ** Fixed inconsistent API documentation reported by Doxygen. 00919 ** 00920 ** Revision 1.44 2003/06/02 17:16:23 joergr 00921 ** Added new helper function DcmItem::findAndCopyElement(). 00922 ** 00923 ** Revision 1.43 2003/06/02 16:58:12 meichel 00924 ** Renamed local variables to avoid name clashes with STL 00925 ** 00926 ** Revision 1.42 2003/05/20 09:01:58 joergr 00927 ** Added new helper methods: findAndGetElement(), findAndGetUint32Array(), 00928 ** FindAndGetSint32Array(), findAndGetFloat64Array(), findAndDeleteElement(). 00929 ** Enhanced findAndGetSequenceItem() and findOrCreateSequenceItem() by checking 00930 ** the return value of ident() - avoids crashes when applied to non-sequence 00931 ** elements. 00932 ** 00933 ** Revision 1.41 2002/12/09 09:31:15 wilkens 00934 ** Modified/Added doc++ documentation. 00935 ** 00936 ** Revision 1.40 2002/12/06 12:49:10 joergr 00937 ** Enhanced "print()" function by re-working the implementation and replacing 00938 ** the boolean "showFullData" parameter by a more general integer flag. 00939 ** Added doc++ documentation. 00940 ** Made source code formatting more consistent with other modules/files. 00941 ** 00942 ** Revision 1.39 2002/08/27 16:55:34 meichel 00943 ** Initial release of new DICOM I/O stream classes that add support for stream 00944 ** compression (deflated little endian explicit VR transfer syntax) 00945 ** 00946 ** Revision 1.38 2002/08/02 08:42:44 joergr 00947 ** Added optional 'pos' parameter to the putAndInsertXXX() methods. 00948 ** 00949 ** Revision 1.37 2002/07/23 14:21:26 meichel 00950 ** Added support for private tag data dictionaries to dcmdata 00951 ** 00952 ** Revision 1.36 2002/06/26 15:47:40 joergr 00953 ** Added support for polymorp OB/OW value representation (e.g. pixel data) to 00954 ** putAndInsertUint8/16Array() methods. 00955 ** 00956 ** Revision 1.35 2002/05/17 09:58:14 meichel 00957 ** fixed bug in DcmItem which caused the parser to fail if the same attribute 00958 ** tag appeared twice within one dataset (which is illegal in DICOM anyway). 00959 ** Added console warning if the attributes read are not in ascending order. 00960 ** 00961 ** Revision 1.34 2002/04/25 10:06:46 joergr 00962 ** Added support for XML output of DICOM objects. 00963 ** 00964 ** Revision 1.33 2001/12/18 11:37:24 joergr 00965 ** Added helper method allowing to create and insert empty elements into an 00966 ** item/dataset. 00967 ** 00968 ** Revision 1.32 2001/11/16 15:54:38 meichel 00969 ** Adapted digital signature code to final text of supplement 41. 00970 ** 00971 ** Revision 1.31 2001/11/09 15:51:59 joergr 00972 ** Added new helper routines for managing sequences and items. 00973 ** 00974 ** Revision 1.30 2001/10/10 15:14:04 joergr 00975 ** Changed parameter DcmTagKey to DcmTag in DcmItem::putAndInsert... methods 00976 ** to support elements which are not in the data dictionary (e.g. private 00977 ** extensions). 00978 ** 00979 ** Revision 1.29 2001/10/02 11:46:45 joergr 00980 ** Added functions to get/put 8 bit values/arrays from/to an item/dataset. 00981 ** 00982 ** Revision 1.28 2001/10/01 15:01:14 joergr 00983 ** Introduced new general purpose functions to get/put DICOM element values 00984 ** from/to an item/dataset - removed some old and rarely used functions. 00985 ** 00986 ** Revision 1.27 2001/09/25 17:19:26 meichel 00987 ** Adapted dcmdata to class OFCondition 00988 ** 00989 ** Revision 1.26 2001/06/01 15:48:40 meichel 00990 ** Updated copyright header 00991 ** 00992 ** Revision 1.25 2000/11/07 16:56:06 meichel 00993 ** Initial release of dcmsign module for DICOM Digital Signatures 00994 ** 00995 ** Revision 1.24 2000/04/14 15:31:32 meichel 00996 ** Removed default value from output stream passed to print() method. 00997 ** Required for use in multi-thread environments. 00998 ** 00999 ** Revision 1.23 2000/03/08 16:26:15 meichel 01000 ** Updated copyright header. 01001 ** 01002 ** Revision 1.22 2000/03/03 14:05:24 meichel 01003 ** Implemented library support for redirecting error messages into memory 01004 ** instead of printing them to stdout/stderr for GUI applications. 01005 ** 01006 ** Revision 1.21 2000/02/10 10:50:51 joergr 01007 ** Added new feature to dcmdump (enhanced print method of dcmdata): write 01008 ** pixel data/item value fields to raw files. 01009 ** 01010 ** Revision 1.20 1999/03/31 09:24:40 meichel 01011 ** Updated copyright header in module dcmdata 01012 ** 01013 ** Revision 1.19 1998/07/15 15:48:48 joergr 01014 ** Removed several compiler warnings reported by gcc 2.8.1 with 01015 ** additional options, e.g. missing copy constructors and assignment 01016 ** operators, initialization of member variables in the body of a 01017 ** constructor instead of the member initialization list, hiding of 01018 ** methods by use of identical names, uninitialized member variables, 01019 ** missing const declaration of char pointers. Replaced tabs by spaces. 01020 ** 01021 ** Revision 1.18 1997/09/22 14:50:43 hewett 01022 ** - Added 2 simple methods to test for the existance of an attribute 01023 ** to DcmItem class (tagExists and tagExistsWithValue). This code 01024 ** was part of dcmgpdir.cc but is more generally useful. 01025 ** - Added 2 methods to find an attribute and retrieve numeric values 01026 ** to DcmItem class (findIntegerNumber and findRealNumber). The old 01027 ** method findLong is now marked as obsolete and reimplemented using 01028 ** findIntegerNumber. 01029 ** 01030 ** Revision 1.17 1997/09/11 15:13:11 hewett 01031 ** Modified getOFString method arguments by removing a default value 01032 ** for the pos argument. By requiring the pos argument to be provided 01033 ** ensures that callers realise getOFString only gets one component of 01034 ** a multi-valued string. 01035 ** 01036 ** Revision 1.16 1997/08/29 08:32:39 andreas 01037 ** - Added methods getOFString and getOFStringArray for all 01038 ** string VRs. These methods are able to normalise the value, i. e. 01039 ** to remove leading and trailing spaces. This will be done only if 01040 ** it is described in the standard that these spaces are not relevant. 01041 ** These methods do not test the strings for conformance, this means 01042 ** especially that they do not delete spaces where they are not allowed! 01043 ** getOFStringArray returns the string with all its parts separated by \ 01044 ** and getOFString returns only one value of the string. 01045 ** CAUTION: Currently getString returns a string with trailing 01046 ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and 01047 ** truncates the original string (since it is not copied!). If you rely on this 01048 ** behaviour please change your application now. 01049 ** Future changes will ensure that getString returns the original 01050 ** string from the DICOM object (NULL terminated) inclusive padding. 01051 ** Currently, if you call getOF... before calling getString without 01052 ** normalisation, you can get the original string read from the DICOM object. 01053 ** 01054 ** Revision 1.15 1997/07/21 08:25:08 andreas 01055 ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) 01056 ** with one unique boolean type OFBool. 01057 ** 01058 ** Revision 1.14 1997/07/07 07:42:03 andreas 01059 ** - Changed parameter type DcmTag & to DcmTagKey & in all search functions 01060 ** in DcmItem, DcmSequenceOfItems, DcmDirectoryRecord and DcmObject 01061 ** 01062 ** Revision 1.13 1997/05/30 06:45:42 andreas 01063 ** - fixed problem of inconsistent interfaces and implementation that the 01064 ** syntax check of GNU C++ does not find. 01065 ** 01066 ** Revision 1.12 1997/05/27 13:48:28 andreas 01067 ** - Add method canWriteXfer to class DcmObject and all derived classes. 01068 ** This method checks whether it is possible to convert the original 01069 ** transfer syntax to an new transfer syntax. The check is used in the 01070 ** dcmconv utility to prohibit the change of a compressed transfer 01071 ** syntax to a uncompressed. 01072 ** 01073 ** Revision 1.11 1997/05/16 08:13:43 andreas 01074 ** - Revised handling of GroupLength elements and support of 01075 ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding 01076 ** got additional enumeration values (for a description see dctypes.h). 01077 ** addGroupLength and removeGroupLength methods are replaced by 01078 ** computeGroupLengthAndPadding. To support Padding, the parameters of 01079 ** element and sequence write functions changed. 01080 ** - Added a new method calcElementLength to calculate the length of an 01081 ** element, item or sequence. For elements it returns the length of 01082 ** tag, length field, vr field, and value length, for item and 01083 ** sequences it returns the length of the whole item. sequence including 01084 ** the Delimitation tag (if appropriate). It can never return 01085 ** UndefinedLength. 01086 ** - Deleted obsolete method DcmItem::calcHeaderLength because the 01087 ** samce functionality is performed by DcmXfer::sizeofTagHeader 01088 ** 01089 ** Revision 1.10 1996/08/05 08:45:23 andreas 01090 ** new print routine with additional parameters: 01091 ** - print into files 01092 ** - fix output length for elements 01093 ** corrected error in search routine with parameter ESM_fromStackTop 01094 ** 01095 ** Revision 1.9 1996/07/17 12:38:58 andreas 01096 ** new nextObject to iterate a DicomDataset, DicomFileFormat, Item, ... 01097 ** 01098 ** Revision 1.8 1996/04/29 15:08:53 hewett 01099 ** Replaced DcmItem::findInt(...) with the more general DcmItem::findLong(...). 01100 ** 01101 ** Revision 1.7 1996/04/16 16:00:05 andreas 01102 ** - added const for Tag in newDicomElement 01103 ** 01104 ** Revision 1.6 1996/03/28 18:52:30 hewett 01105 ** Added 2 simple find&get methods (findString & findInt). 01106 ** 01107 ** Revision 1.5 1996/01/29 13:38:12 andreas 01108 ** - new put method for every VR to put value as a string 01109 ** - better and unique print methods 01110 ** 01111 ** Revision 1.4 1996/01/09 11:06:15 andreas 01112 ** New Support for Visual C++ 01113 ** Correct problems with inconsistent const declarations 01114 ** 01115 ** Revision 1.3 1996/01/05 13:22:56 andreas 01116 ** - changed to support new streaming facilities 01117 ** - more cleanups 01118 ** - merged read / write methods for block and file transfer 01119 ** 01120 */