Show
Ignore:
Timestamp:
04/13/09 11:35:52 (4 years ago)
Author:
robert
Message:

From Santosh Gaikwad, "I have added the exception handling in ply loader. All exceptions I am catching in VertexData::readPlyFile() and made sure that application will not crash or exit if any exception occurred. I am returning NULL from VertexData::readPlyFile() if any exception occurred.
"

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgPlugins/ply/plyfile.cpp

    r10014 r10040  
    4040 
    4141#include "ply.h" 
     42#include"typedefs.h" 
     43 
    4244#include <stdio.h> 
    4345#include <stdlib.h> 
    4446#include <math.h> 
    4547#include <string.h> 
     48 
     49 
    4650 
    4751#ifdef WIN32 
     
    316320 
    317321  plyfile = ply_write (fp, nelems, elem_names, file_type); 
     322 
     323  // If the plyfile could not load return NULL 
    318324  if (plyfile == NULL) 
    319325    return (NULL); 
     
    354360  elem = find_element (plyfile, elem_name); 
    355361  if (elem == NULL) { 
    356     fprintf(stderr,"ply_describe_element: can't find element '%s'\n",elem_name); 
    357     exit (-1); 
     362    char error[100]; 
     363    sprintf (error, "ply_describe_element: can't find element '%s'\n",elem_name); 
     364    throw ply::MeshException( error ); 
    358365  } 
    359366 
     
    501508  elem = find_element (plyfile, elem_name); 
    502509  if (elem == NULL) { 
    503     fprintf(stderr,"ply_element_count: can't find element '%s'\n",elem_name); 
    504     exit (-1); 
     510    char error[100]; 
     511    sprintf (error, "ply_element_count: can't find element '%s'\n",elem_name); 
     512    throw ply::MeshException( error ); 
    505513  } 
    506514 
     
    537545      break; 
    538546    default: 
    539       fprintf (stderr, "ply_header_complete: bad file type = %d\n", 
     547      char error[100]; 
     548      sprintf (error, "ply_header_complete: bad file type = %d\n", 
    540549               plyfile->file_type); 
    541       exit (-1); 
     550      throw ply::MeshException( error ); 
    542551  } 
    543552 
     
    596605  elem = find_element (plyfile, elem_name); 
    597606  if (elem == NULL) { 
    598     fprintf(stderr, "ply_elements_setup: can't find element '%s'\n", elem_name); 
    599     exit (-1); 
     607    char error[100]; 
     608    sprintf (error, "ply_elements_setup: can't find element '%s'\n", elem_name); 
     609    throw ply::MeshException( error ); 
    600610  } 
    601611 
     
    941951  plyfile = ply_read (fp, nelems, elem_names); 
    942952 
     953  if(!plyfile) 
     954  { 
     955    std::cout<<"Ply File Error : Could not read file"<<std::endl; 
     956    return NULL; 
     957  } 
     958 
    943959  /* determine the file type and version */ 
    944960 
     
    13311347  elem = find_element (plyfile, elem_name); 
    13321348  if (elem == NULL) { 
    1333     fprintf (stderr, 
    1334             "ply_get_other_element: can't find element '%s'\n", elem_name); 
    1335     exit (-1); 
     1349    char error[100]; 
     1350    sprintf (error, "ply_get_other_element: can't find element '%s'\n", elem_name); 
     1351    throw ply::MeshException( error ); 
    13361352  } 
    13371353 
     
    16511667  words = get_words (plyfile->fp, &nwords, &orig_line); 
    16521668  if (words == NULL) { 
    1653     fprintf (stderr, "ply_get_element: unexpected end of file\n"); 
    1654     exit (-1); 
     1669    char error[100]; 
     1670    sprintf (error, "ply_get_element: unexpected end of file\n"); 
     1671    throw ply::MeshException( error ); 
    16551672  } 
    16561673 
     
    18481865 
    18491866  if (code <= PLY_START_TYPE || code >= PLY_END_TYPE) { 
    1850     fprintf (stderr, "write_scalar_type: bad data code = %d\n", code); 
    1851     exit (-1); 
     1867    char error[100]; 
     1868    sprintf (error, "write_scalar_type: bad data code = %d\n", code); 
     1869    throw ply::MeshException( error ); 
    18521870  } 
    18531871 
     
    21192137      break; 
    21202138    default: 
    2121       fprintf (stderr, "write_binary_item: bad type = %d\n", type); 
    2122       exit (-1); 
     2139      char error[100]; 
     2140      sprintf (error, "write_binary_item: bad type = %d\n", type); 
     2141      throw ply::MeshException( error ); 
    21232142  } 
    21242143} 
     
    21632182      break; 
    21642183    default: 
    2165       fprintf (stderr, "write_ascii_item: bad type = %d\n", type); 
    2166       exit (-1); 
     2184      char error[100]; 
     2185      sprintf (error, "write_ascii_item: bad type = %d\n", type); 
     2186      throw ply::MeshException( error ); 
    21672187  } 
    21682188} 
     
    22352255      break; 
    22362256    default: 
    2237       fprintf (stderr, "get_stored_item: bad type = %d\n", type); 
    2238       exit (-1); 
     2257      char error[100]; 
     2258      sprintf (error, "get_stored_item: bad type = %d\n", type); 
     2259      throw ply::MeshException( error ); 
    22392260  } 
    22402261} 
     
    22672288 
    22682289  ptr = (void *) c; 
     2290  size_t result = 0; 
    22692291 
    22702292  switch (type) { 
    22712293    case PLY_CHAR: 
    2272       fread (ptr, 1, 1, plyfile->fp); 
     2294      result = fread (ptr, 1, 1, plyfile->fp); 
     2295      if(result < 1) 
     2296      { 
     2297          throw ply::MeshException( "Error in reading PLY file." 
     2298                                 "fread not succeeded." ); 
     2299      } 
    22732300      *int_val = *((char *) ptr); 
    22742301      *uint_val = *int_val; 
     
    22772304      case PLY_UCHAR: 
    22782305      case PLY_UINT8: 
    2279           fread (ptr, 1, 1, plyfile->fp); 
     2306          result = fread (ptr, 1, 1, plyfile->fp); 
     2307          if(result < 1) 
     2308          { 
     2309              throw ply::MeshException( "Error in reading PLY file." 
     2310                                 "fread not succeeded." ); 
     2311          } 
    22802312          *uint_val = *((unsigned char *) ptr); 
    22812313          *int_val = *uint_val; 
     
    22832315          break; 
    22842316      case PLY_SHORT: 
    2285           fread (ptr, 2, 1, plyfile->fp); 
     2317          result = fread (ptr, 2, 1, plyfile->fp); 
     2318          if(result < 1 ) 
     2319          { 
     2320              throw ply::MeshException( "Error in reading PLY file." 
     2321                                 "fread not succeeded." ); 
     2322          } 
    22862323          if( plyfile->file_type == PLY_BINARY_BE ) 
    22872324          { 
     
    22972334          break; 
    22982335      case PLY_USHORT: 
    2299           fread (ptr, 2, 1, plyfile->fp); 
     2336          result = fread (ptr, 2, 1, plyfile->fp); 
     2337          if(result < 1) 
     2338          { 
     2339              throw ply::MeshException( "Error in reading PLY file." 
     2340                                 "fread not succeeded." ); 
     2341          } 
    23002342          if( plyfile->file_type == PLY_BINARY_BE ) 
    23012343          { 
     
    23122354      case PLY_INT: 
    23132355      case PLY_INT32: 
    2314           fread (ptr, 4, 1, plyfile->fp); 
     2356          result = fread (ptr, 4, 1, plyfile->fp); 
     2357          if(result < 1) 
     2358          { 
     2359              throw ply::MeshException( "Error in reading PLY file." 
     2360                                 "fread not succeeded." ); 
     2361          } 
    23152362          if( plyfile->file_type == PLY_BINARY_BE ) 
    23162363          { 
     
    23262373          break; 
    23272374      case PLY_UINT: 
    2328           fread (ptr, 4, 1, plyfile->fp); 
     2375          result = fread (ptr, 4, 1, plyfile->fp); 
     2376          if(result < 1) 
     2377          { 
     2378              throw ply::MeshException( "Error in reading PLY file." 
     2379                                 "fread not succeeded." ); 
     2380          } 
    23292381          if( plyfile->file_type == PLY_BINARY_BE ) 
    23302382          { 
     
    23412393      case PLY_FLOAT: 
    23422394      case PLY_FLOAT32: 
    2343           fread (ptr, 4, 1, plyfile->fp); 
     2395          result = fread (ptr, 4, 1, plyfile->fp); 
     2396          if(result < 1) 
     2397          { 
     2398              throw ply::MeshException( "Error in reading PLY file." 
     2399                                 "fread not succeeded." ); 
     2400          } 
    23442401          if( plyfile->file_type == PLY_BINARY_BE ) 
    23452402          { 
     
    23552412          break; 
    23562413      case PLY_DOUBLE: 
    2357           fread (ptr, 8, 1, plyfile->fp); 
     2414          result = fread (ptr, 8, 1, plyfile->fp); 
     2415          if(!result < 1) 
     2416          { 
     2417              throw ply::MeshException( "Error in reading PLY file." 
     2418                                 "fread not succeeded." ); 
     2419          } 
    23582420          if( plyfile->file_type == PLY_BINARY_BE ) 
    23592421          { 
     
    23692431      break; 
    23702432    default: 
    2371       fprintf (stderr, "get_binary_item: bad type = %d\n", type); 
    2372       exit (-1); 
     2433      char error[100]; 
     2434      sprintf (error, "get_binary_item: bad type = %d\n", type); 
     2435      throw ply::MeshException( error ); 
    23732436  } 
    23742437} 
     
    24252488 
    24262489    default: 
    2427       fprintf (stderr, "get_ascii_item: bad type = %d\n", type); 
    2428       exit (-1); 
     2490      char error[100]; 
     2491      sprintf (error, "get_ascii_item: bad type = %d\n", type); 
     2492      throw ply::MeshException( error ); 
    24292493  } 
    24302494} 
     
    24972561      break; 
    24982562    default: 
    2499       fprintf (stderr, "store_item: bad type = %d\n", type); 
    2500       exit (-1); 
     2563      char error[100]; 
     2564      sprintf (error, "store_item: bad type = %d\n", type); 
     2565      throw ply::MeshException( error ); 
    25012566  } 
    25022567}