From: Braden M. <br...@us...> - 2006-06-07 18:10:12
|
Update of /cvsroot/openvrml/openvrml/src/libopenvrml/openvrml In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv22088/src/libopenvrml/openvrml Modified Files: vrml97node.cpp Log Message: Provide an error handler for libjpeg; the default one calls exit. Instead, print the error message using openvrml::browser::err. Index: vrml97node.cpp =================================================================== RCS file: /cvsroot/openvrml/openvrml/src/libopenvrml/openvrml/vrml97node.cpp,v retrieving revision 1.105 retrieving revision 1.106 diff -C2 -d -r1.105 -r1.106 *** vrml97node.cpp 18 May 2006 04:11:31 -0000 1.105 --- vrml97node.cpp 7 Jun 2006 14:36:45 -0000 1.106 *************** *** 36,39 **** --- 36,40 ---- # include <iterator> # include <limits> + # include <sstream> # include <boost/algorithm/string/predicate.hpp> # include <boost/array.hpp> *************** *** 6738,6741 **** --- 6739,6744 ---- long num_bytes); extern "C" void openvrml_jpeg_term_source(j_decompress_ptr cinfo); + extern "C" void openvrml_jpeg_error_exit(j_common_ptr cinfo); + extern "C" void openvrml_jpeg_output_message(j_common_ptr cinfo); # endif *************** *** 6743,6746 **** --- 6746,6750 ---- public openvrml::stream_listener { + const std::string uri_; boost::recursive_mutex & node_mutex_; openvrml::image & image_; *************** *** 6789,6792 **** --- 6793,6798 ---- long num_bytes); friend void openvrml_jpeg_term_source(j_decompress_ptr cinfo); + friend void openvrml_jpeg_error_exit(j_common_ptr cinfo); + friend void openvrml_jpeg_output_message(j_common_ptr cinfo); class jpeg_reader : public image_reader { *************** *** 6797,6806 **** }; - private: - jpeg_decompress_struct cinfo_; struct error_mgr { jpeg_error_mgr pub; jmp_buf jmpbuf; ! } error_mgr_; source_mgr source_mgr_; --- 6803,6815 ---- }; struct error_mgr { jpeg_error_mgr pub; jmp_buf jmpbuf; ! image_stream_listener * stream_listener; ! }; ! ! private: ! jpeg_decompress_struct cinfo_; ! error_mgr error_mgr_; source_mgr source_mgr_; *************** *** 6839,6843 **** public: ! image_stream_listener(openvrml::image & image, openvrml::node & node, boost::recursive_mutex & node_mutex); --- 6848,6853 ---- public: ! image_stream_listener(const std::string & uri, ! openvrml::image & image, openvrml::node & node, boost::recursive_mutex & node_mutex); *************** *** 7156,7159 **** --- 7166,7191 ---- {} + void openvrml_jpeg_error_exit(j_common_ptr cinfo) + { + typedef image_stream_listener::jpeg_reader::error_mgr error_mgr; + error_mgr * const err = reinterpret_cast<error_mgr *>(cinfo->err); + (*cinfo->err->output_message)(cinfo); + longjmp(err->jmpbuf, 1); + } + + void openvrml_jpeg_output_message(j_common_ptr cinfo) + { + typedef image_stream_listener::jpeg_reader::error_mgr error_mgr; + error_mgr * const err = reinterpret_cast<error_mgr *>(cinfo->err); + char buffer[JMSG_LENGTH_MAX]; + (*cinfo->err->format_message)(cinfo, buffer); + assert(err->stream_listener); + std::ostringstream msg; + msg << err->stream_listener->uri_ << ": " << buffer << std::endl; + openvrml::browser & browser = + err->stream_listener->node_.type().metatype().browser(); + browser.err(msg.str()); + } + image_stream_listener::jpeg_reader:: jpeg_reader(image_stream_listener & stream_listener): *************** *** 7170,7175 **** --- 7202,7210 ---- this->cinfo_.err = jpeg_std_error(&this->error_mgr_.pub); + this->error_mgr_.pub.error_exit = openvrml_jpeg_error_exit; + this->error_mgr_.pub.output_message = openvrml_jpeg_output_message; int jmpval = setjmp(this->error_mgr_.jmpbuf); if (jmpval != 0) { return; } + this->error_mgr_.stream_listener = &stream_listener; jpeg_create_decompress(&this->cinfo_); this->source_mgr_.pub.next_input_byte = 0; *************** *** 7374,7380 **** image_stream_listener:: ! image_stream_listener(openvrml::image & image, openvrml::node & node, boost::recursive_mutex & node_mutex): node_mutex_(node_mutex), image_(image), --- 7409,7417 ---- image_stream_listener:: ! image_stream_listener(const std::string & uri, ! openvrml::image & image, openvrml::node & node, boost::recursive_mutex & node_mutex): + uri_(uri), node_mutex_(node_mutex), image_(image), *************** *** 7419,7429 **** } else { using std::auto_ptr; ! auto_ptr<resource_istream> ! in(this->scene() ! ->get_resource(this->front_url_.mfstring::value())); ! auto_ptr<stream_listener> ! listener(new image_stream_listener(this->front, ! *this, ! this->mutex())); read_stream(in, listener); } --- 7456,7467 ---- } else { using std::auto_ptr; ! auto_ptr<resource_istream> in( ! this->scene()->get_resource( ! this->front_url_.mfstring::value())); ! auto_ptr<stream_listener> listener( ! new image_stream_listener(in->url(), ! this->front, ! *this, ! this->mutex())); read_stream(in, listener); } *************** *** 7435,7445 **** } else { using std::auto_ptr; ! auto_ptr<resource_istream> ! in(this->scene() ! ->get_resource(this->back_url_.mfstring::value())); ! auto_ptr<stream_listener> ! listener(new image_stream_listener(this->back, ! *this, ! this->mutex())); read_stream(in, listener); } --- 7473,7484 ---- } else { using std::auto_ptr; ! auto_ptr<resource_istream> in( ! this->scene()->get_resource( ! this->back_url_.mfstring::value())); ! auto_ptr<stream_listener> listener( ! new image_stream_listener(in->url(), ! this->back, ! *this, ! this->mutex())); read_stream(in, listener); } *************** *** 7451,7461 **** } else { using std::auto_ptr; ! auto_ptr<resource_istream> ! in(this->scene() ! ->get_resource(this->left_url_.mfstring::value())); ! auto_ptr<stream_listener> ! listener(new image_stream_listener(this->left, ! *this, ! this->mutex())); read_stream(in, listener); } --- 7490,7501 ---- } else { using std::auto_ptr; ! auto_ptr<resource_istream> in( ! this->scene()->get_resource( ! this->left_url_.mfstring::value())); ! auto_ptr<stream_listener> listener( ! new image_stream_listener(in->url(), ! this->left, ! *this, ! this->mutex())); read_stream(in, listener); } *************** *** 7467,7477 **** } else { using std::auto_ptr; ! auto_ptr<resource_istream> ! in(this->scene() ! ->get_resource(this->right_url_.mfstring::value())); ! auto_ptr<stream_listener> ! listener(new image_stream_listener(this->right, ! *this, ! this->mutex())); read_stream(in, listener); } --- 7507,7518 ---- } else { using std::auto_ptr; ! auto_ptr<resource_istream> in( ! this->scene()->get_resource( ! this->right_url_.mfstring::value())); ! auto_ptr<stream_listener> listener( ! new image_stream_listener(in->url(), ! this->right, ! *this, ! this->mutex())); read_stream(in, listener); } *************** *** 7483,7493 **** } else { using std::auto_ptr; ! auto_ptr<resource_istream> ! in(this->scene() ! ->get_resource(this->top_url_.mfstring::value())); ! auto_ptr<stream_listener> ! listener(new image_stream_listener(this->top, ! *this, ! this->mutex())); read_stream(in, listener); } --- 7524,7535 ---- } else { using std::auto_ptr; ! auto_ptr<resource_istream> in( ! this->scene()->get_resource( ! this->top_url_.mfstring::value())); ! auto_ptr<stream_listener> listener( ! new image_stream_listener(in->url(), ! this->top, ! *this, ! this->mutex())); read_stream(in, listener); } *************** *** 7499,7509 **** } else { using std::auto_ptr; ! auto_ptr<resource_istream> ! in(this->scene() ! ->get_resource(this->bottom_url_.mfstring::value())); ! auto_ptr<stream_listener> ! listener(new image_stream_listener(this->bottom, ! *this, ! this->mutex())); read_stream(in, listener); } --- 7541,7552 ---- } else { using std::auto_ptr; ! auto_ptr<resource_istream> in( ! this->scene()->get_resource( ! this->bottom_url_.mfstring::value())); ! auto_ptr<stream_listener> listener( ! new image_stream_listener(in->url(), ! this->bottom, ! *this, ! this->mutex())); read_stream(in, listener); } *************** *** 12900,12907 **** auto_ptr<resource_istream> in( this->scene()->get_resource(this->url_.mfstring::value())); ! auto_ptr<stream_listener> ! listener(new image_stream_listener(this->image_, ! *this, ! this->mutex())); read_stream(in, listener); } --- 12943,12951 ---- auto_ptr<resource_istream> in( this->scene()->get_resource(this->url_.mfstring::value())); ! auto_ptr<stream_listener> listener( ! new image_stream_listener(in->url(), ! this->image_, ! *this, ! this->mutex())); read_stream(in, listener); } |