]> Creatis software - creaImageIO.git/commitdiff
More checking when illegal files
authorjean-pierre roux <jean-pierre.roux@creatis.insa-lyon.fr>
Fri, 9 Oct 2009 17:10:31 +0000 (17:10 +0000)
committerjean-pierre roux <jean-pierre.roux@creatis.insa-lyon.fr>
Fri, 9 Oct 2009 17:10:31 +0000 (17:10 +0000)
src2/creaImageIOUltrasonixImageReader.cpp
src2/creaImageIOUltrasonixImageReader.h

index 014e0953c7a6be97215f1ff10844922d61fd61d4..2640d9e80ced8aef9fe5cffe6879bef973d1f32e 100644 (file)
@@ -9,7 +9,7 @@ namespace creaImageIO
 #define HEADER_SIZE    19
 #define TYPE_RF                16
 #define TYPE_B8                4
-#define TYPE_B32               8
+#define TYPE_B32       8
 
 
   //=====================================================================
@@ -29,7 +29,7 @@ namespace creaImageIO
   struct Ultrasonix_header
   {
     // frames, width, height, ultrasounds frequency, sampling rate
-    int type,frame,width,height,frequency,samplingRate;
+    int type, frame, width, height, frequency, samplingRate;
   };
   //=====================================================================
 
@@ -37,15 +37,18 @@ namespace creaImageIO
   //=====================================================================
   bool ReadHeader( FILE *Ultrasonix_file, Ultrasonix_header& h )
   {
-    int *header=(int*)malloc(sizeof(int)*HEADER_SIZE);
-    fread(header,sizeof(int),HEADER_SIZE,Ultrasonix_file);
-        h.type = header[0];
-    h.frame  = header[1];
-    h.height = header[2];
-    h.width = header[3];
-        h.frequency = header[14];
-        h.samplingRate = header[15];
-        free(header);  
+    //int *header=(int*)malloc(sizeof(int)*HEADER_SIZE);
+    int header[HEADER_SIZE];
+    fread(header, sizeof(int), HEADER_SIZE, Ultrasonix_file);
+    if (ferror(Ultrasonix_file))
+       return false;
+    h.type         = header[0];
+    h.frame        = header[1];
+    h.height       = header[2];
+    h.width        = header[3];
+    h.frequency    = header[14];
+    h.samplingRate = header[15];
+    //free(header);  
     return true;
   }
   //=====================================================================
@@ -53,27 +56,32 @@ namespace creaImageIO
   //=====================================================================
   bool UltrasonixImageReader::CanRead(const std::string& filename)
   { 
+    long size;
     bool ok = false;
-    FILE *Ultrasonix_file=fopen(filename.c_str(),"rb");
-        long size;
+    FILE *Ultrasonix_file=fopen(filename.c_str(), "rb");
     if (Ultrasonix_file) 
     {
-               Ultrasonix_header h;
-               ReadHeader(Ultrasonix_file,h);
-
-               fseek(Ultrasonix_file,0,SEEK_END);              // go to end of file
-               if (h.type == TYPE_RF)
-                       size = (ftell(Ultrasonix_file) - (HEADER_SIZE+h.frame) * sizeof(int)) / sizeof(short);
-               else if (h.type == TYPE_B8)
-                       size = (ftell(Ultrasonix_file) - HEADER_SIZE * sizeof(int)) / sizeof(char);
-               else if (h.type == TYPE_B32)
-                       size = (ftell(Ultrasonix_file) - HEADER_SIZE * sizeof(int)) / sizeof(int);
-
-               // check if the data size corresponds to the dimensions of the images
-               if (size == h.width * h.height * h.frame)
-                       ok = true;
-               
+       Ultrasonix_header h;
+       if (!ReadHeader(Ultrasonix_file, h) )
+       {
                fclose(Ultrasonix_file);
+               std::cout << "cannot read Ultrasonix header for file [" << filename << "]" << std::endl;                                
+               return false;   
+       }
+
+       fseek(Ultrasonix_file,0,SEEK_END);              // go to end of file
+       if (h.type == TYPE_RF)
+               size = (ftell(Ultrasonix_file) - (HEADER_SIZE+h.frame) * sizeof(int)) / sizeof(short);
+       else if (h.type == TYPE_B8)
+               size = (ftell(Ultrasonix_file) - HEADER_SIZE * sizeof(int)) / sizeof(char);
+       else if (h.type == TYPE_B32)
+               size = (ftell(Ultrasonix_file) - HEADER_SIZE * sizeof(int)) / sizeof(int);
+
+       // check if the data size corresponds to the dimensions of the images
+       if (size == h.width * h.height * h.frame)
+               ok = true;
+               
+       fclose(Ultrasonix_file);
     }
     return ok;
   }
@@ -83,76 +91,82 @@ namespace creaImageIO
   vtkImageData* UltrasonixImageReader::ReadImage(const std::string& filename)
   {
     FILE *Ultrasonix_file=fopen(filename.c_str(),"rb");
-    if (!Ultrasonix_file) return false;
+    if (!Ultrasonix_file) 
+    {
+       std::cout << "cannot open file [" << filename << "]" << std::endl;
+       return 0;
+    }
     Ultrasonix_header h;
     if (!ReadHeader(Ultrasonix_file,h)) 
     {
+        std::cout << "cannot read Ultrasonix header for file [" << filename << "]" << std::endl;
+       fclose(Ultrasonix_file);  
+       return 0;
+    }
+
+    long frame_size = h.height   * h.width;      
+    long im_size    = frame_size * h.frame;
+
+    short *dataRF,  *ptrRF;
+    char  *dataB8,  *ptrB8;
+    int   *dataB32, *ptrB32;
+    vtkImageData* im;
+    int temp;
+
+    switch (h.type)
+    {
+       case TYPE_RF:
+               dataRF = (short*)malloc(sizeof(short)*im_size);
+               ptrRF  = dataRF;
+
+               for (int k=0; k<h.frame; k++)
+               {
+                       int frame_number;
+                       fread(&frame_number, sizeof(int), 1, Ultrasonix_file);
+                       fread(ptrRF,sizeof(short), frame_size, Ultrasonix_file);
+                       ptrRF += frame_size;
+               }
+               fclose(Ultrasonix_file);  
+
+               im = crea::NewVtkImageDataFromRaw( dataRF, h.width, h.height, h.frame);
+       break;
+
+       case TYPE_B8:
+               dataB8 = (char*)malloc(sizeof(char)*im_size);
+               ptrB8  = dataB8;
+               for (int k=0; k<h.frame; k++)
+               {
+                       fread(ptrB8,sizeof(char), frame_size, Ultrasonix_file);
+                       ptrB8 += frame_size;
+               }
+               // in mode b frames width and height are inverted
+               temp     = h.width;
+               h.width  = h.height;
+               h.height = temp;
+
                fclose(Ultrasonix_file);  
-               return 0;
+
+               im = crea::NewVtkImageDataFromRaw( dataB8, h.width, h.height, h.frame);
+       break;
+
+       case TYPE_B32:
+               dataB32 = (int*)malloc(sizeof(int)*im_size);
+               ptrB32  = dataB32;
+               for (int k=0; k<h.frame; k++)
+               {
+                       fread(ptrB32, sizeof(int), frame_size, Ultrasonix_file);
+                       ptrB32 += frame_size;
+               }
+               // in B mode frames width and height are inverted
+               temp     = h.width;
+               h.width  = h.height;
+               h.height = temp;
+
+               fclose(Ultrasonix_file);  
+
+               im = crea::NewVtkImageDataFromRaw( dataB32, h.width, h.height, h.frame);
+       break;
     }
-    
-    long im_size = h.height * h.width * h.frame;
-    long frame_size = h.height * h.width;  
-        short *dataRF, *ptrRF;
-        char *dataB8, *ptrB8;
-        int *dataB32, *ptrB32;
-        vtkImageData* im;
-        int temp;
-
-        switch (h.type)
-        {
-               case TYPE_RF:
-                       dataRF = (short*)malloc(sizeof(short)*im_size);
-                       ptrRF = dataRF;
-
-                       for (int k=0; k<h.frame; k++)
-                       {
-                               int frame_number;
-                               fread(&frame_number,sizeof(int),1,Ultrasonix_file);
-                               fread(ptrRF,sizeof(short),frame_size,Ultrasonix_file);
-                               ptrRF += frame_size;
-                       }
-                       fclose(Ultrasonix_file);  
-
-                       im = crea::NewVtkImageDataFromRaw( dataRF, h.width, h.height, h.frame);
-               break;
-
-               case TYPE_B8:
-                       dataB8 = (char*)malloc(sizeof(char)*im_size);
-                       ptrB8 = dataB8;
-                       for (int k=0; k<h.frame; k++)
-                       {
-                               fread(ptrB8,sizeof(char),frame_size,Ultrasonix_file);
-                               ptrB8 += frame_size;
-                       }
-                       // in mode b frames width and height are inverted
-                       temp = h.width;
-                       h.width = h.height;
-                       h.height = temp;
-                       
-                       fclose(Ultrasonix_file);  
-
-                       im = crea::NewVtkImageDataFromRaw( dataB8, h.width, h.height, h.frame);
-               break;
-
-               case TYPE_B32:
-                       dataB32 = (int*)malloc(sizeof(int)*im_size);
-                       ptrB32 = dataB32;
-                       for (int k=0; k<h.frame; k++)
-                       {
-                               fread(ptrB32,sizeof(int),frame_size,Ultrasonix_file);
-                               ptrB32 += frame_size;
-                       }
-                       // in B mode frames width and height are inverted
-                       temp = h.width;
-                       h.width = h.height;
-                       h.height = temp;
-
-                       fclose(Ultrasonix_file);  
-
-                       im = crea::NewVtkImageDataFromRaw( dataB32, h.width, h.height, h.frame);
-               break;
-        }
 
     return im;
 }
@@ -169,74 +183,80 @@ namespace creaImageIO
 
 
   //=====================================================================
 void UltrasonixImageReader::ReadAttributes(const std::string& filename, 
vold UltrasonixImageReader::ReadAttributes(const std::string& filename, 
                                      std::map<std::string,std::string>& attr)
 {
-    GimmickMessage(2,"Reading attributes from '"<<filename<<std::endl);
+ {
+    GimmickMessage(2,"Reading attributes from '" << filename << std::endl);
 
-    FILE *Ultrasonix_file=fopen(filename.c_str(),"rb");
-    if (!Ultrasonix_file) return;
+    FILE *Ultrasonix_file = fopen(filename.c_str(), "rb");
+    if (!Ultrasonix_file)
+    {
+       std::cout << "cannot open RF file [" << filename << "]" << std::endl;
+       return;
+    }
+       
     Ultrasonix_header h;
-    if (!ReadHeader(Ultrasonix_file,h)) 
-      {
-        fclose(Ultrasonix_file);  
+    if (!ReadHeader(Ultrasonix_file, h)) 
+    {
+        fclose(Ultrasonix_file);
+        std::cout << "cannot read Ultrasonix Attributes for RF file [" << filename << "]" << std::endl;  
        return;
-      }
+    }
+   
     fclose(Ultrasonix_file);  
   
     // Columns
     char cols[128];
-    sprintf(cols,"%i",h.width);
+    sprintf(cols,"%i", h.width);
     // Rows
     char rows[128];
-    sprintf(rows,"%i",h.height);
+    sprintf(rows,"%i", h.height);
     // Planes 
     char planes[128];
-    sprintf(planes,"%i",h.frame);
-        // Sampling frequency
-        char samplingFrequency[128];
-        sprintf(samplingFrequency,"%i",h.samplingRate);
-        // Transducer frequency
-        char transducerFrequency[128];
-        sprintf(transducerFrequency,"%i",h.frequency);
-    
-    
+    sprintf(planes,"%i", h.frame);
+    // Sampling frequency
+    char samplingFrequency[128];
+    sprintf(samplingFrequency,"%i", h.samplingRate);
+    // Transducer frequency
+    char transducerFrequency[128];
+    sprintf(transducerFrequency,"%i", h.frequency);
+   
     // 
     std::map<std::string,std::string>::iterator i;
     if ( (i = attr.find("FullFileName")) != attr.end())
     {
-               i->second = filename;
+       i->second = filename;
     }
     if ( (i = attr.find("D0004_1500")) != attr.end())
     {
-               boost::filesystem::path full_path(filename);
-               std::string f = full_path.leaf();
-               i->second = f;
+       boost::filesystem::path full_path(filename);
+       std::string f = full_path.leaf();
+       i->second = f;
     }
     if ( (i = attr.find("D0028_0010")) != attr.end())
     {
-               i->second = rows;
+       i->second = rows;
     }
     if ( (i = attr.find("D0028_0011")) != attr.end())
     {
-               i->second = cols;
+       i->second = cols;
     }
     if ( (i = attr.find("D0028_0012")) != attr.end())
     {
-               i->second = planes;
+       i->second = planes;
+    }
+    if ( (i = attr.find("D003a_001a")) != attr.end())
+    {
+       i->second = samplingFrequency;
+    }
+    if ( (i = attr.find("D0018_6030")) != attr.end())
+    {
+       i->second = transducerFrequency;
     }
-        if ( (i = attr.find("D003a_001a")) != attr.end())
-        {
-                i->second = samplingFrequency;
-        }
-        if ( (i = attr.find("D0018_6030")) != attr.end())
-        {
-                i->second = transducerFrequency;
-        }
-
     
-   GimmickMessage(2,"Attributes map:"<<std::endl<<attr<<std::endl);
-  }
+    GimmickMessage(2,"Attributes map:"<<std::endl<<attr<<std::endl);
+    return;
+}
   //=====================================================================
 
 } // namespace creaImageIO
index 6ba7b42d3dc92b3b2de3b52aa676f07b351be57b..c0c9c5434ebf1d7996d65641bab8b42e20cf0932 100644 (file)
@@ -1,14 +1,11 @@
 #ifndef __creaImageIOUltrasonixImageReader_h_INCLUDED__
 #define __creaImageIOUltrasonixImageReader_h_INCLUDED__
 
-
 #include <creaImageIOAbstractImageReader.h>
 #include <creaImageIOSystem.h>
 
 namespace creaImageIO
 {
-
-
   /**
    * \ingroup IO
    */
@@ -31,14 +28,9 @@ namespace creaImageIO
     virtual void ReadAttributes(const std::string& filename, 
                                tree::AttributeMapType& attr);
 
-
   };
   //=====================================================================
 
-
-
 } // namespace creaImageIO
 
-
-
 #endif // #ifndef __creaImageIOUltrasonixImageReader_h_INCLUDED__