void RenderBackend::MakeFailedResult(int error, POVMS_Message& result) { POVMS_Message newmsg(result, result.GetClass(), kPOVMsgIdent_Failed); result = newmsg; result.SetInt(kPOVAttrib_ErrorNumber, error); result.SetString(kPOVAttrib_EnglishText, pov_base::Exception::lookup_code(error).c_str()); }
void RenderBackend::MakeFailedResult(const pov_base::Exception& e, POVMS_Message& result) { POVMS_Message newmsg(result, result.GetClass(), kPOVMsgIdent_Failed); result = newmsg; result.SetInt(kPOVAttrib_ErrorNumber, e.code(kCannotHandleRequestErr)); // pov_base::Exception(...) does a code->string lookup if a string isn't supplied result.SetString(kPOVAttrib_EnglishText, e.what()); }
void RenderBackend::CreateScene(POVMS_Message& msg, POVMS_Message& result, int) { if(ValidateFrontendAddress(msg.GetSourceAddress(), result) == false) return; try { POVMSAddress backendAddress = POVMSInvalidAddress; int err = POVMS_GetContextAddress(context, &backendAddress); if(err != kNoErr) throw POV_EXCEPTION_CODE (err); shared_ptr<Scene> scene(new Scene(backendAddress, msg.GetSourceAddress(), scenecounter + 1)); scenecounter++; POVMS_Message newresult(result, result.GetClass(), kPOVMsgIdent_Done); result = newresult; result.SetInt(kPOVAttrib_SceneId, scenecounter); scenes[scenecounter] = scene; try { scene2views[scenecounter] = ViewIdSet(); } catch(std::exception&) { scenes.erase(scenecounter); throw; } } catch(pov_base::Exception& e) { MakeFailedResult(e, result); } catch(std::runtime_error& e) { MakeFailedResult(e.what(), result); } catch(std::bad_alloc&) { MakeFailedResult(kOutOfMemoryErr, result); } }
void RenderBackend::CreateView(POVMS_Message& msg, POVMS_Message& result, int) { if(ValidateFrontendAddress(msg.GetSourceAddress(), result) == false) return; try { SceneId sid = msg.GetInt(kPOVAttrib_SceneId); SceneMap::iterator i(scenes.find(sid)); if(i == scenes.end()) throw POV_EXCEPTION_CODE(kInvalidIdentifierErr); shared_ptr<View> view(i->second->NewView(msg.TryGetInt(kPOVAttrib_Width, 160), msg.TryGetInt(kPOVAttrib_Height, 120), viewcounter + 1)); viewcounter++; POVMS_Message newresult(result, result.GetClass(), kPOVMsgIdent_Done); result = newresult; result.SetInt(kPOVAttrib_ViewId, viewcounter); views[viewcounter] = view; try { view2scene[viewcounter] = sid; } catch(std::exception&) { views.erase(viewcounter); throw; } try { scene2views[sid].insert(viewcounter); } catch(std::exception&) { views.erase(viewcounter); view2scene.erase(viewcounter); throw; } } catch(pov_base::Exception& e) { MakeFailedResult(e, result); } catch(std::runtime_error& e) { MakeFailedResult(e.what(), result); } catch(std::bad_alloc&) { MakeFailedResult(kOutOfMemoryErr, result); } }
void RenderBackend::MakeDoneResult(POVMS_Message& result) { POVMS_Message newmsg(result, result.GetClass(), kPOVMsgIdent_Done); result = newmsg; }
void RenderBackend::MakeFailedResult(const char *str, POVMS_Message& result) { POVMS_Message newmsg(result, result.GetClass(), kPOVMsgIdent_Failed); result = newmsg; result.SetString(kPOVAttrib_EnglishText, str); }