Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 69 additions & 24 deletions c/interactor_c_api.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,14 @@ void f3d_interactor_add_command(f3d_interactor_t* interactor, const char* action
callback(c_args.data(), static_cast<int>(c_args.size()), user_data);
};

cpp_interactor->addCommand(action, cpp_callback);
try
{
cpp_interactor->addCommand(action, cpp_callback);
}
catch (const f3d::interactor::already_exists_exception& ex)
{
f3d::log::error(ex.what());
}
}

//----------------------------------------------------------------------------
Expand Down Expand Up @@ -437,7 +444,15 @@ int f3d_interactor_trigger_command(
}

f3d::interactor* cpp_interactor = reinterpret_cast<f3d::interactor*>(interactor);
return cpp_interactor->triggerCommand(command, keep_comments != 0) ? 1 : 0;
try
{
return cpp_interactor->triggerCommand(command, keep_comments != 0) ? 1 : 0;
}
catch (const f3d::interactor::command_runtime_exception& ex)
{
f3d::log::error(ex.what());
return 0;
}
}

//----------------------------------------------------------------------------
Expand Down Expand Up @@ -477,8 +492,15 @@ void f3d_interactor_add_binding(f3d_interactor_t* interactor, const f3d_interact

std::string cpp_group = group ? group : "";

cpp_interactor->addBinding(cpp_bind, cpp_commands, cpp_group, nullptr,
static_cast<f3d::interactor::BindingType>(type), notify != 0);
try
{
cpp_interactor->addBinding(cpp_bind, cpp_commands, cpp_group, nullptr,
static_cast<f3d::interactor::BindingType>(type), notify != 0);
}
catch (const f3d::interactor::already_exists_exception& ex)
{
f3d::log::error(ex.what());
}
}

//----------------------------------------------------------------------------
Expand Down Expand Up @@ -542,24 +564,32 @@ f3d_interaction_bind_t* f3d_interactor_get_binds_for_group(
}

const f3d::interactor* cpp_interactor = reinterpret_cast<f3d::interactor*>(interactor);
std::vector<f3d::interaction_bind_t> binds = cpp_interactor->getBindsForGroup(group);

*count = static_cast<int>(binds.size());
if (binds.empty())
try
{
return nullptr;
}
std::vector<f3d::interaction_bind_t> binds = cpp_interactor->getBindsForGroup(group);

f3d_interaction_bind_t* result = new f3d_interaction_bind_t[binds.size()];
*count = static_cast<int>(binds.size());
if (binds.empty())
{
return nullptr;
}

for (size_t i = 0; i < binds.size(); ++i)
f3d_interaction_bind_t* result = new f3d_interaction_bind_t[binds.size()];

for (size_t i = 0; i < binds.size(); ++i)
{
result[i].mod = static_cast<f3d_interaction_bind_modifier_keys_t>(binds[i].mod);
std::strncpy(result[i].inter, binds[i].inter.c_str(), sizeof(result[i].inter) - 1);
result[i].inter[sizeof(result[i].inter) - 1] = '\0';
}

return result;
}
catch (const f3d::interactor::does_not_exists_exception& ex)
{
result[i].mod = static_cast<f3d_interaction_bind_modifier_keys_t>(binds[i].mod);
std::strncpy(result[i].inter, binds[i].inter.c_str(), sizeof(result[i].inter) - 1);
result[i].inter[sizeof(result[i].inter) - 1] = '\0';
f3d::log::error(ex.what());
return nullptr;
}

return result;
}

//----------------------------------------------------------------------------
Expand Down Expand Up @@ -609,13 +639,20 @@ void f3d_interactor_get_binding_documentation(f3d_interactor_t* interactor,
cpp_bind.mod = static_cast<f3d::interaction_bind_t::ModifierKeys>(bind->mod);
cpp_bind.inter = bind->inter;

auto [doc_str, value_str] = cpp_interactor->getBindingDocumentation(cpp_bind);
try
{
auto [doc_str, value_str] = cpp_interactor->getBindingDocumentation(cpp_bind);

std::strncpy(doc->doc, doc_str.c_str(), sizeof(doc->doc) - 1);
doc->doc[sizeof(doc->doc) - 1] = '\0';
std::strncpy(doc->doc, doc_str.c_str(), sizeof(doc->doc) - 1);
doc->doc[sizeof(doc->doc) - 1] = '\0';

std::strncpy(doc->value, value_str.c_str(), sizeof(doc->value) - 1);
doc->value[sizeof(doc->value) - 1] = '\0';
std::strncpy(doc->value, value_str.c_str(), sizeof(doc->value) - 1);
doc->value[sizeof(doc->value) - 1] = '\0';
}
catch (const f3d::interactor::does_not_exists_exception& ex)
{
f3d::log::error(ex.what());
}
}

//----------------------------------------------------------------------------
Expand All @@ -631,8 +668,16 @@ f3d_interactor_binding_type_t f3d_interactor_get_binding_type(
f3d::interaction_bind_t cpp_bind;
cpp_bind.mod = static_cast<f3d::interaction_bind_t::ModifierKeys>(bind->mod);
cpp_bind.inter = bind->inter;
f3d::interactor::BindingType cpp_type = cpp_interactor->getBindingType(cpp_bind);
return static_cast<f3d_interactor_binding_type_t>(cpp_type);
try
{
f3d::interactor::BindingType cpp_type = cpp_interactor->getBindingType(cpp_bind);
return static_cast<f3d_interactor_binding_type_t>(cpp_type);
}
catch (const f3d::interactor::does_not_exists_exception& ex)
{
f3d::log::error(ex.what());
return F3D_INTERACTOR_BINDING_OTHER;
}
}

//----------------------------------------------------------------------------
Expand Down
4 changes: 2 additions & 2 deletions c/interactor_c_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ extern "C"
* @param group Group name.
* @param count Output parameter for number of binds.
* @return Array of binds. Caller must free the array with
* f3d_interactor_free_bind_array().
* f3d_interactor_free_bind_array(). NULL if group does not exist.
*/
F3D_EXPORT f3d_interaction_bind_t* f3d_interactor_get_binds_for_group(
f3d_interactor_t* interactor, const char* group, int* count);
Expand Down Expand Up @@ -287,7 +287,7 @@ extern "C"
*
* @param interactor Interactor handle.
* @param bind Interaction bind.
* @return Binding type.
* @return Binding type. F3D_INTERACTOR_BINDING_OTHER if bind does not exist.
*/
F3D_EXPORT f3d_interactor_binding_type_t f3d_interactor_get_binding_type(
f3d_interactor_t* interactor, const f3d_interaction_bind_t* bind);
Expand Down
Loading