int main () { // Redirect stdout to this stream, so that involuntary // writes to stdout do not interfere with our protocol. std::ostringstream oss; stdout_redir = oss.rdbuf(); stdout_orig = std::cout.rdbuf(); std::cout.rdbuf(stdout_redir); #ifdef SET_BINARY_STREAMS _setmode(_fileno(stdout), _O_BINARY); std::cout.setf(std::ios_base::binary); _setmode(_fileno(stdin), _O_BINARY); std::cin.setf(std::ios_base::binary); #endif bool has_more = false; IfcGeom::Iterator<float>* iterator = 0; Hello().write(std::cout); int exit_code = 0; for (;;) { const int32_t msg_type = sread<int32_t>(std::cin); switch (msg_type) { case IFC_MODEL: { IfcModel m; m.read(std::cin); std::string::size_type len = m.string().size(); char* data = new char[len]; memcpy(data, m.string().c_str(), len); IfcGeom::IteratorSettings settings; settings.use_world_coords() = false; settings.weld_vertices() = false; settings.convert_back_units() = true; settings.include_curves() = true; iterator = new IfcGeom::Iterator<float>(settings, data, (int)len); has_more = iterator->initialize(); More(has_more).write(std::cout); continue; } case GET: { Get g; g.read(std::cin); if (!has_more) { exit_code = 1; break; } const IfcGeom::TriangulationElement<float>* geom = static_cast<const IfcGeom::TriangulationElement<float>*>(iterator->get()); Entity(geom).write(std::cout); continue; } case NEXT: { Next n; n.read(std::cin); has_more = iterator->next(); if (!has_more) { delete iterator; iterator = 0; } More(has_more).write(std::cout); continue; } case GET_LOG: { GetLog gl; gl.read(std::cin); WriteLog(iterator->getLog()).write(std::cout); continue; } case BYE: { Bye().write(std::cout); exit_code = 0; break; } default: exit_code = 1; break; } break; } std::cout.rdbuf(stdout_orig); return exit_code; }