]> Creatis software - gdcm.git/blobdiff - src/gdcmFileHelper.cxx
* Change the DocEntry inheritance to RefCounter
[gdcm.git] / src / gdcmFileHelper.cxx
index bfe2a944a5d40bcbe15e4888e3faea10e7ca427c..51d66886d649b81cd7e9e429502e9b79e0c27778 100644 (file)
@@ -4,8 +4,8 @@
   Module:    $RCSfile: gdcmFileHelper.cxx,v $
   Language:  C++
 
-  Date:      $Date: 2005/10/20 07:27:43 $
-  Version:   $Revision: 1.65 $
+  Date:      $Date: 2005/10/24 16:00:48 $
+  Version:   $Revision: 1.70 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -100,7 +100,7 @@ fh1->Write(newFileName);
    fp = opens file(fileName);
    ComputeGroup0002Length( );
    BitsAllocated 12->16
-      RemoveEntryNoDestroy(palettes, etc)
+      RemoveEntry(palettes, etc)
       Document::WriteContent(fp, writetype);
    RestoreWrite();
       (moves back to the File all the archived elements)
@@ -161,20 +161,20 @@ FileHelper::FileHelper(File *header)
 }
 
 #ifndef GDCM_LEGACY_REMOVE
-/**
- * \brief DEPRECATED : use SetFilename() + SetLoadMode() + Load() methods
+/* 
+ *  brief DEPRECATED : use SetFilename() + SetLoadMode() + Load() methods
  *        Constructor dedicated to deal with the *pixels* area of a ACR/DICOMV3
  *        file (gdcm::File only deals with the ... header)
  *        Opens (in read only and when possible) an existing file and checks
  *        for DICOM compliance. Returns NULL on failure.
  *        It will be up to the user to load the pixels into memory
- * \note  the in-memory representation of all available tags found in
+ *  note  the in-memory representation of all available tags found in
  *        the DICOM header is post-poned to first header information access.
  *        This avoid a double parsing of public part of the header when
  *        one sets an a posteriori shadow dictionary (efficiency can be
  *        seen as a side effect).   
- * @param filename file to be opened for parsing
- * @deprecated  use SetFilename() + Load() methods
+ *  param filename file to be opened for parsing
+ *  deprecated  use SetFilename() + Load() methods
  */
 FileHelper::FileHelper(std::string const &filename )
 {
@@ -222,8 +222,7 @@ FileHelper::~FileHelper()
 
 /**
  * \brief Sets the LoadMode of the internal gdcm::File as a boolean string. 
- *        NO_SEQ, NO_SHADOW, NO_SHADOWSEQ
- *... (nothing more, right now)
+ *        NO_SEQ, NO_SHADOW, NO_SHADOWSEQ ... (nothing more, right now)
  *        WARNING : before using NO_SHADOW, be sure *all* your files
  *        contain accurate values in the 0x0000 element (if any) 
  *        of *each* Shadow Group. The parser will fail if the size is wrong !
@@ -351,7 +350,7 @@ size_t FileHelper::GetImageDataSize()
 }
 
 /**
- * \brief   Get the size of the image data
+ * \brief   Get the size of the image data.
  *          If the image could be converted to RGB using a LUT, 
  *          this transformation is not taken into account by GetImageDataRawSize
  *          (use GetImageDataSize if you wish)
@@ -367,7 +366,8 @@ size_t FileHelper::GetImageDataRawSize()
 }
 
 /**
- * \brief   - Allocates necessary memory,
+ * \brief brings pixels into memory :  
+ *          - Allocates necessary memory,
  *          - Reads the pixels from disk (uncompress if necessary),
  *          - Transforms YBR pixels, if any, into RGB pixels,
  *          - Transforms 3 planes R, G, B, if any, into a single RGB Plane
@@ -401,11 +401,12 @@ uint8_t *FileHelper::GetImageData()
 }
 
 /**
- * \brief   Allocates necessary memory, 
- *          Transforms YBR pixels (if any) into RGB pixels
- *          Transforms 3 planes R, G, B  (if any) into a single RGB Plane
- *          Copies the pixel data (image[s]/volume[s]) to newly allocated zone. 
- *          DOES NOT transform Grey plane + 3 Palettes into a RGB Plane
+ * \brief brings pixels into memory :  
+ *          - Allocates necessary memory, 
+ *          - Transforms YBR pixels (if any) into RGB pixels
+ *          - Transforms 3 planes R, G, B  (if any) into a single RGB Plane
+ *          - Copies the pixel data (image[s]/volume[s]) to newly allocated zone. 
+ *          - DOES NOT transform Grey plane + 3 Palettes into a RGB Plane
  * @return  Pointer to newly allocated pixel data.
  *          NULL if alloc fails 
  */
@@ -415,8 +416,8 @@ uint8_t *FileHelper::GetImageDataRaw ()
 }
 
 #ifndef GDCM_LEGACY_REMOVE
-/**
- * \brief   Useless function, since PixelReadConverter forces us 
+/*
+ * \ brief   Useless function, since PixelReadConverter forces us 
  *          copy the Pixels anyway.  
  *          Reads the pixels from disk (uncompress if necessary),
  *          Transforms YBR pixels, if any, into RGB pixels
@@ -424,7 +425,7 @@ uint8_t *FileHelper::GetImageDataRaw ()
  *          Transforms single Grey plane + 3 Palettes into a RGB Plane   
  *          Copies at most MaxSize bytes of pixel data to caller allocated
  *          memory space.
- * \warning This function allows people that want to build a volume
+ * \ warning This function allows people that want to build a volume
  *          from an image stack *not to* have, first to get the image pixels, 
  *          and then move them to the volume area.
  *          It's absolutely useless for any VTK user since vtk chooses 
@@ -433,12 +434,12 @@ uint8_t *FileHelper::GetImageDataRaw ()
  *          to load the image line by line, starting from the end.
  *          VTK users have to call GetImageData
  *     
- * @param   destination Address (in caller's memory space) at which the
+ * @ param   destination Address (in caller's memory space) at which the
  *          pixel data should be copied
- * @param   maxSize Maximum number of bytes to be copied. When MaxSize
+ * @ param   maxSize Maximum number of bytes to be copied. When MaxSize
  *          is not sufficient to hold the pixel data the copy is not
  *          executed (i.e. no partial copy).
- * @return  On success, the number of bytes actually copied. Zero on
+ * @ return  On success, the number of bytes actually copied. Zero on
  *          failure e.g. MaxSize is lower than necessary.
  */
 size_t FileHelper::GetImageDataIntoVector (void *destination, size_t maxSize)
@@ -864,6 +865,9 @@ void FileHelper::SetWriteToRaw()
 
       Archive->Push(photInt);
       Archive->Push(pixel);
+
+      photInt->Delete();
+      pixel->Delete();
    }
 }
 
@@ -916,6 +920,11 @@ void FileHelper::SetWriteToRGB()
       Archive->Push(photInt);
       Archive->Push(pixel);
 
+      spp->Delete();
+      planConfig->Delete();
+      photInt->Delete();
+      pixel->Delete();
+
       // Remove any LUT
       Archive->Push(0x0028,0x1101);
       Archive->Push(0x0028,0x1102);
@@ -944,6 +953,10 @@ void FileHelper::SetWriteToRGB()
          Archive->Push(bitsAlloc);
          Archive->Push(bitsStored);
          Archive->Push(highBit);
+
+         bitsAlloc->Delete();
+         bitsStored->Delete();
+         highBit->Delete();
       }
    }
    else
@@ -1025,6 +1038,7 @@ void FileHelper::SetWriteFileTypeToJPEG()
    tss->SetString(ts);
 
    Archive->Push(tss);
+   tss->Delete();
 }
 
 void FileHelper::SetWriteFileTypeToExplicitVR()
@@ -1036,6 +1050,7 @@ void FileHelper::SetWriteFileTypeToExplicitVR()
    tss->SetString(ts);
 
    Archive->Push(tss);
+   tss->Delete();
 }
 
 /**
@@ -1050,6 +1065,7 @@ void FileHelper::SetWriteFileTypeToImplicitVR()
    tss->SetString(ts);
 
    Archive->Push(tss);
+   tss->Delete();
 }
 
 
@@ -1072,8 +1088,8 @@ void FileHelper::SetWriteToLibido()
    {
       std::string rows, columns; 
 
-      DataEntry *newRow=new DataEntry(oldRow->GetDictEntry());
-      DataEntry *newCol=new DataEntry(oldCol->GetDictEntry());
+      DataEntry *newRow=DataEntry::New(oldRow->GetDictEntry());
+      DataEntry *newCol=DataEntry::New(oldCol->GetDictEntry());
 
       newRow->Copy(oldCol);
       newCol->Copy(oldRow);
@@ -1083,11 +1099,15 @@ void FileHelper::SetWriteToLibido()
 
       Archive->Push(newRow);
       Archive->Push(newCol);
+
+      newRow->Delete();
+      newCol->Delete();
    }
 
    DataEntry *libidoCode = CopyDataEntry(0x0008,0x0010);
    libidoCode->SetString("ACRNEMA_LIBIDO_1.1");
    Archive->Push(libidoCode);
+   libidoCode->Delete();
 }
 
 /**
@@ -1103,6 +1123,7 @@ void FileHelper::SetWriteToNoLibido()
          DataEntry *libidoCode = CopyDataEntry(0x0008,0x0010);
          libidoCode->SetString("");
          Archive->Push(libidoCode);
+         libidoCode->Delete();
       }
    }
 }
@@ -1143,7 +1164,7 @@ DataEntry *FileHelper::CopyDataEntry(uint16_t group, uint16_t elem,
 
    if ( oldE )
    {
-      newE = new DataEntry(oldE->GetDictEntry());
+      newE = DataEntry::New(oldE->GetDictEntry());
       newE->Copy(oldE);
    }
    else
@@ -1287,19 +1308,19 @@ void FileHelper::CheckMandatoryElements()
    if ( e_0008_0016 )
    {
       // Create 'Source Image Sequence' SeqEntry
-      SeqEntry *sis = new SeqEntry (
+      SeqEntry *sis = SeqEntry::New (
             Global::GetDicts()->GetDefaultPubDict()->GetEntry(0x0008, 0x2112) );
       SQItem *sqi = new SQItem(1);
       // (we assume 'SOP Instance UID' exists too) 
       // create 'Referenced SOP Class UID'
-      DataEntry *e_0008_1150 = new DataEntry(
+      DataEntry *e_0008_1150 = DataEntry::New(
             Global::GetDicts()->GetDefaultPubDict()->GetEntry(0x0008, 0x1150) );
       e_0008_1150->SetString( e_0008_0016->GetString());
       sqi->AddEntry(e_0008_1150);
       
       // create 'Referenced SOP Instance UID'
       DataEntry *e_0008_0018 = FileInternal->GetDataEntry(0x0008, 0x0018);
-      DataEntry *e_0008_1155 = new DataEntry(
+      DataEntry *e_0008_1155 = DataEntry::New(
             Global::GetDicts()->GetDefaultPubDict()->GetEntry(0x0008, 0x1155) );
       e_0008_1155->SetString( e_0008_0018->GetString());
       sqi->AddEntry(e_0008_1155);
@@ -1307,26 +1328,21 @@ void FileHelper::CheckMandatoryElements()
       sis->AddSQItem(sqi,1); 
       // temporarily replaces any previous 'Source Image Sequence' 
       Archive->Push(sis);
+      sis->Delete();
  
       // 'Image Type' (The written image is no longer an 'ORIGINAL' one)
       CopyMandatoryEntry(0x0008,0x0008,"DERIVED\\PRIMARY");
-   } 
-   else
-   {
-      // There was no 'SOP Class UID'.
-      // the source image was NOT a true Dicom one.
-      // We consider the image is a 'Secondary Capture' one
-      // SOP Class UID
-      // [Secondary Capture Image Storage]
-      SetMandatoryEntry(0x0008,0x0016,"1.2.840.10008.5.1.4.1.1.7");
    }
 
    // At the end, not to overwrite the original ones,
    // needed by 'Referenced SOP Instance UID', 'Referenced SOP Class UID'   
    // 'SOP Instance UID'  
-      CopyMandatoryEntry(0x0008,0x0018,sop);
-   // 'SOP Class UID' 
-      CopyMandatoryEntry(0x0008,0x0016,"1.2.840.10008.5.1.4.1.1.7"); 
+   CopyMandatoryEntry(0x0008,0x0018,sop);
+   
+   // whether a 'SOP Class UID' already exists or not in the original image
+   // the gdcm written image *is* a [Secondary Capture Image Storage] !
+   // 'SOP Class UID' : [Secondary Capture Image Storage]
+   CopyMandatoryEntry(0x0008,0x0016,"1.2.840.10008.5.1.4.1.1.7"); 
              
 // ---- The user will never have to take any action on the following ----.
    // new value for 'SOP Instance UID'
@@ -1339,11 +1355,13 @@ void FileHelper::CheckMandatoryElements()
    CopyMandatoryEntry(0x0008,0x0013,Util::GetCurrentTime().c_str());
 
 // ----- Add Mandatory Entries if missing ---
-// Entries whose type is 1 are mandatory, with a mandatory value
-// Entries whose type is 1c are mandatory-inside-a-Sequence
-// Entries whose type is 2 are mandatory, with a optional value
-// Entries whose type is 2c are mandatory-inside-a-Sequence
-// Entries whose type is 3 are optional
+    // Entries whose type is 1 are mandatory, with a mandatory value
+    // Entries whose type is 1c are mandatory-inside-a-Sequence,
+    //                          with a mandatory value
+    // Entries whose type is 2 are mandatory, with an optional value
+    // Entries whose type is 2c are mandatory-inside-a-Sequence,
+    //                          with an optional value
+    // Entries whose type is 3 are optional
 
    // 'Study Instance UID'
    // Keep the value if exists
@@ -1402,17 +1420,19 @@ void FileHelper::CheckMandatoryEntry(uint16_t group,uint16_t elem,std::string va
    DataEntry *entry = FileInternal->GetDataEntry(group,elem);
    if ( !entry )
    {
-      entry = new DataEntry(Global::GetDicts()->GetDefaultPubDict()->GetEntry(group,elem));
+      entry = DataEntry::New(Global::GetDicts()->GetDefaultPubDict()->GetEntry(group,elem));
       entry->SetString(value);
       Archive->Push(entry);
+      entry->Delete();
    }
 }
 
 void FileHelper::SetMandatoryEntry(uint16_t group,uint16_t elem,std::string value)
 {
-   DataEntry *entry = new DataEntry(Global::GetDicts()->GetDefaultPubDict()->GetEntry(group,elem));
+   DataEntry *entry = DataEntry::New(Global::GetDicts()->GetDefaultPubDict()->GetEntry(group,elem));
    entry->SetString(value);
    Archive->Push(entry);
+   entry->Delete();
 }
 
 void FileHelper::CopyMandatoryEntry(uint16_t group,uint16_t elem,std::string value)
@@ -1420,6 +1440,7 @@ void FileHelper::CopyMandatoryEntry(uint16_t group,uint16_t elem,std::string val
    DataEntry *entry = CopyDataEntry(group,elem);
    entry->SetString(value);
    Archive->Push(entry);
+   entry->Delete();
 }
 
 /**
@@ -1455,7 +1476,6 @@ void FileHelper::RestoreWriteMandatory()
 
    Archive->Restore(0x0020,0x000d);
    Archive->Restore(0x0020,0x000e);
-
 }
 
 //-----------------------------------------------------------------------------