Changeset 10040

Show
Ignore:
Timestamp:
04/13/09 11:35:52 (5 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.
"

Location:
OpenSceneGraph/trunk/src/osgPlugins/ply
Files:
3 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} 
  • OpenSceneGraph/trunk/src/osgPlugins/ply/typedefs.h

    r10012 r10040  
    2020#   include <osg/Notify> 
    2121#    include <cassert> 
    22 #   define MESHASSERT  assert 
     22 
     23#ifdef NDEBUG 
     24#   define MESHASSERT( x ) 
     25#else 
     26#    define MESHASSERT(x) { if( !(x) )                                      \ 
     27              osg::notify(osg::WARN) << "Ply Loader ##### Assert: " << #x << " #####" << std::endl; } 
     28#endif 
     29 
    2330#   define MESHERROR   osg::notify(osg::WARN) 
    2431#   define MESHWARN    osg::notify(osg::WARN) 
  • OpenSceneGraph/trunk/src/osgPlugins/ply/vertexData.cpp

    r10012 r10040  
    158158    float   version; 
    159159    bool    result = false; 
    160     int        nComments; 
    161     char**    comments; 
    162      
    163     PlyFile* file = ply_open_for_reading( const_cast< char* >( filename ),  
     160    int     nComments; 
     161    char**  comments; 
     162     
     163    PlyFile* file = NULL; 
     164 
     165    // Try to open ply file as for reading 
     166    try{ 
     167            file  = ply_open_for_reading( const_cast< char* >( filename ),  
    164168                                          &nPlyElems, &elemNames,  
    165169                                          &fileType, &version ); 
     170    } 
     171    // Catch the if any exception thrown 
     172    catch( exception& e ) 
     173    { 
     174        MESHERROR << "Unable to read PLY file, an exception occured:  "  
     175                    << e.what() << endl; 
     176    } 
    166177 
    167178    if( !file ) 
     
    173184 
    174185    MESHASSERT( elemNames != 0 ); 
     186     
    175187 
    176188    nComments = file->num_comments; 
     
    196208        int nProps; 
    197209         
    198         PlyProperty** props = ply_get_element_description( file, elemNames[i],  
    199                                                            &nElems, &nProps ); 
     210        PlyProperty** props = NULL; 
     211        try{ 
     212                props = ply_get_element_description( file, elemNames[i],  
     213                                                     &nElems, &nProps ); 
     214        } 
     215        catch( exception& e ) 
     216        { 
     217            MESHERROR << "Unable to get PLY file description, an exception occured:  "  
     218                        << e.what() << endl; 
     219        } 
    200220        MESHASSERT( props != 0 ); 
    201221         
     
    222242            if( ignoreColors ) 
    223243                MESHINFO << "Colors in PLY file ignored per request." << endl; 
    224              
    225             // Read vertices and store in a std::vector array 
    226             readVertices( file, nElems, hasColors && !ignoreColors ); 
    227             // Check whether all vertices are loaded or not 
    228             MESHASSERT( _vertices->size() == static_cast< size_t >( nElems ) ); 
    229             // Check all color elements read or not 
    230             if( hasColors && !ignoreColors ) 
    231                 MESHASSERT( _colors->size() == static_cast< size_t >( nElems ) ); 
     244          
     245            try {    
     246                // Read vertices and store in a std::vector array 
     247                readVertices( file, nElems, hasColors && !ignoreColors ); 
     248                // Check whether all vertices are loaded or not 
     249                MESHASSERT( _vertices->size() == static_cast< size_t >( nElems ) ); 
     250                // Check all color elements read or not 
     251                if( hasColors && !ignoreColors ) 
     252                    MESHASSERT( _colors->size() == static_cast< size_t >( nElems ) ); 
     253            } 
     254            catch( exception& e ) 
     255            { 
     256                MESHERROR << "Unable to read vertex in PLY file, an exception occured:  "  
     257                            << e.what() << endl; 
     258                // stop for loop by setting the loop variable to break condition 
     259                // this way resources still get released even on error cases 
     260                i = nPlyElems; 
     261                 
     262            } 
    232263        } 
    233264        // If the string is face means triangle info started