Exemple #1
0
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());
}
Exemple #2
0
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());
}
Exemple #3
0
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);
    }
}
Exemple #4
0
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);
    }
}