void ModelOutput::Write(const CModel& model, std::ostream &stream, ModelFormat format) { stream.exceptions(std::ios_base::failbit | std::ios_base::badbit); try { switch (format) { case ModelFormat::Text: WriteTextModel(model, stream); break; case ModelFormat::Binary: WriteBinaryModel(model, stream); break; case ModelFormat::Old: WriteOldModel(model, stream); break; } } catch (const CModelIOException& e) { throw; } catch (const std::exception& e) { throw CModelIOException(std::string("Error saving model data: ") + e.what()); } }
// Save & change and restore stream properties void saver_tests_2 ( std::istream & input, std::ostream & output, std::ostream & err ) { using std::locale; using std::ios_base; boost::io::ios_tie_saver const its( input, &err ); boost::io::ios_rdbuf_saver const irs( output, err.rdbuf() ); boost::io::ios_iword_saver const iis( output, my_index, 69L ); boost::io::ios_pword_saver const ipws( output, my_index, &err ); output << "The data is (a third time; adding the numbers):\n"; boost::io::ios_flags_saver const ifls( output, (output.flags() & ~ios_base::adjustfield) | ios_base::showpos | ios_base::boolalpha | (ios_base::internal & ios_base::adjustfield) ); boost::io::ios_precision_saver const iprs( output, 9 ); boost::io::ios_fill_saver const ifis( output, '@' ); output << '\t' << test_string << '\n'; boost::io::ios_width_saver const iws( output, 12 ); output.put( '\t' ); output << test_num1 + test_num2; output.put( '\n' ); locale loc( locale::classic(), new backward_bool_names ); boost::io::ios_locale_saver const ils( output, loc ); output << '\t' << test_bool << '\n'; BOOST_CHECK( &err == output.pword(my_index) ); BOOST_CHECK( 69L == output.iword(my_index) ); try { boost::io::ios_exception_saver const ies( output, ios_base::eofbit ); boost::io::ios_iostate_saver const iis( output, output.rdstate() | ios_base::eofbit ); BOOST_ERROR( "previous line should have thrown" ); } catch ( ios_base::failure &f ) { err << "Got the expected I/O failure: \"" << f.what() << "\".\n"; BOOST_CHECK( output.exceptions() == ios_base::goodbit ); } catch ( ... ) { err << "Got an unknown error when doing exception test!\n"; throw; } }
inline std::ostream& alert_stream() { // Double parentheses: don't parse comma as a macro parameter separator. BOOST_STATIC_ASSERT((boost::is_base_and_derived<alert_buf,T>::value)); static T buffer_; static std::ostream stream_(&buffer_); stream_.clear(); stream_.exceptions(std::ios_base::failbit | std::ios_base::badbit); return stream_; }
/* * Writes the given SBML document to the output stream. * * @return true on success and false if one of the underlying parser * components fail (rare). */ bool SBMLWriter::writeSBML (const SBMLDocument* d, std::ostream& stream) { bool result = false; try { stream.exceptions(ios_base::badbit | ios_base::failbit | ios_base::eofbit); XMLOutputStream xos(stream, "UTF-8", true, mProgramName, mProgramVersion); d->write(xos); stream << endl; result = true; } catch (ios_base::failure&) { SBMLErrorLog *log = (const_cast<SBMLDocument *>(d))->getErrorLog(); log->logError(XMLFileOperationError); } return result; }
bool renderPresentation( const std::map<std::string,std::string>& vars, const std::vector<boost::iostreams::regex_filter>& filters, std::ostream& os, std::string* pErrMsg) { std::string presentationTemplate = resourceFiles().get("presentation/slides.html"); std::istringstream templateStream(presentationTemplate); try { os.exceptions(std::istream::failbit | std::istream::badbit); boost::iostreams::filtering_ostream filteredStream ; // template filter text::TemplateFilter templateFilter(vars); filteredStream.push(templateFilter); // custom filters for (std::size_t i=0; i<filters.size(); i++) filteredStream.push(filters[i]); // target stream filteredStream.push(os); boost::iostreams::copy(templateStream, filteredStream, 128); } catch(const std::exception& e) { *pErrMsg = e.what(); return false; } return true; }
// Save, change, and restore stream properties void saver_tests_1 ( std::istream & input, std::ostream & output, std::ostream & err ) { using std::locale; using std::ios_base; using std::setw; boost::io::ios_flags_saver const ifls( output ); boost::io::ios_precision_saver const iprs( output ); boost::io::ios_width_saver const iws( output ); boost::io::ios_tie_saver const its( input ); boost::io::ios_rdbuf_saver const irs( output ); boost::io::ios_fill_saver const ifis( output ); boost::io::ios_locale_saver const ils( output ); boost::io::ios_iword_saver const iis( output, my_index ); boost::io::ios_pword_saver const ipws( output, my_index ); locale loc( locale::classic(), new backward_bool_names ); input.tie( &err ); output.rdbuf( err.rdbuf() ); output.iword( my_index ) = 69L; output.pword( my_index ) = &err; output << "The data is (again):\n"; output.setf( ios_base::showpos | ios_base::boolalpha ); output.setf( ios_base::internal, ios_base::adjustfield ); output.fill( '@' ); output.precision( 9 ); output << '\t' << test_string << '\n'; output << '\t' << setw( 10 ) << test_num1 << '\n'; output << '\t' << setw( 15 ) << test_num2 << '\n'; output.imbue( loc ); output << '\t' << test_bool << '\n'; BOOST_CHECK( &err == output.pword(my_index) ); BOOST_CHECK( 69L == output.iword(my_index) ); try { boost::io::ios_exception_saver const ies( output ); boost::io::ios_iostate_saver const iis( output ); output.exceptions( ios_base::eofbit ); output.setstate( ios_base::eofbit ); BOOST_ERROR( "previous line should have thrown" ); } catch ( ios_base::failure &f ) { err << "Got the expected I/O failure: \"" << f.what() << "\".\n"; BOOST_CHECK( output.exceptions() == ios_base::goodbit ); } catch ( ... ) { err << "Got an unknown error when doing exception test!\n"; throw; } }
//Rebuild PE image and write it to "out" ostream //If strip_dos_header is true, DOS headers partially will be used for PE headers //If change_size_of_headers == true, SizeOfHeaders will be recalculated automatically //If save_bound_import == true, existing bound import directory will be saved correctly (because some compilers and bind.exe put it to PE headers) void rebuild_pe(pe_base& pe, std::ostream& out, bool strip_dos_header, bool change_size_of_headers, bool save_bound_import) { if(out.bad()) throw pe_exception("Stream is bad", pe_exception::stream_is_bad); if(save_bound_import && pe.has_bound_import()) { if(pe.section_data_length_from_rva(pe.get_directory_rva(image_directory_entry_bound_import), pe.get_directory_rva(image_directory_entry_bound_import), section_data_raw, true) < pe.get_directory_size(image_directory_entry_bound_import)) throw pe_exception("Incorrect bound import directory", pe_exception::incorrect_bound_import_directory); } //Change ostream state out.exceptions(std::ios::goodbit); out.clear(); uint32_t original_bound_import_rva = pe.has_bound_import() ? pe.get_directory_rva(image_directory_entry_bound_import) : 0; if(original_bound_import_rva && original_bound_import_rva > pe.get_size_of_headers()) { //No need to do anything with bound import directory //if it is placed inside of any section, not headers original_bound_import_rva = 0; save_bound_import = false; } { image_dos_header dos_header; //Rebuild PE image headers rebuild_pe(pe, dos_header, strip_dos_header, change_size_of_headers, save_bound_import); //Write DOS header out.write(reinterpret_cast<const char*>(&dos_header), strip_dos_header ? 8 * sizeof(uint16_t) : sizeof(image_dos_header)); } //If we have stub overlay, write it too { const std::string& stub = pe.get_stub_overlay(); if(stub.size()) { out.write(stub.data(), stub.size()); size_t aligned_size = pe_utils::align_up(stub.size(), sizeof(uint32_t)); //Align PE header, which is right after rich overlay while(aligned_size > stub.size()) { out.put('\0'); --aligned_size; } } } //Write NT headers out.write(static_cast<const pe_base&>(pe).get_nt_headers_ptr(), pe.get_sizeof_nt_header() - sizeof(image_data_directory) * (image_numberof_directory_entries - pe.get_number_of_rvas_and_sizes())); //Write section headers const section_list& sections = pe.get_image_sections(); for(section_list::const_iterator it = sections.begin(); it != sections.end(); ++it) { out.write(reinterpret_cast<const char*>(&(*it).get_raw_header()), sizeof(image_section_header)); } //Write bound import data if requested if(save_bound_import && pe.has_bound_import()) { out.write(pe.section_data_from_rva(original_bound_import_rva, section_data_raw, true), pe.get_directory_size(image_directory_entry_bound_import)); } //Write section data finally for(section_list::const_iterator it = sections.begin(); it != sections.end(); ++it) { const section& s = *it; std::streamoff wpos = out.tellp(); //Fill unused overlay data between sections with null bytes for(unsigned int i = 0; i < s.get_pointer_to_raw_data() - wpos; i++) out.put(0); //Write raw section data out.write(s.get_raw_data().data(), s.get_size_of_raw_data()); } }