|
16 | 16 |
|
17 | 17 | #include <rcl/error_handling.h> |
18 | 18 | #include <rcl/expand_topic_name.h> |
| 19 | +#include <rcl/graph.h> |
19 | 20 | #include <rcl/node.h> |
20 | 21 | #include <rcl/rcl.h> |
21 | 22 | #include <rcl/validate_topic_name.h> |
@@ -1051,6 +1052,159 @@ NAN_METHOD(IsContextValid) { |
1051 | 1052 | info.GetReturnValue().Set(Nan::New(is_valid)); |
1052 | 1053 | } |
1053 | 1054 |
|
| 1055 | +void ExtractNamesAndTypes(rcl_names_and_types_t names_and_types, |
| 1056 | + v8::Local<v8::Array>* result_list) { |
| 1057 | + for (int i = 0; i < names_and_types.names.size; ++i) { |
| 1058 | + auto item = v8::Object::New(v8::Isolate::GetCurrent()); |
| 1059 | + std::string topic_name = names_and_types.names.data[i]; |
| 1060 | + item->Set(Nan::New("name").ToLocalChecked(), |
| 1061 | + Nan::New(names_and_types.names.data[i]).ToLocalChecked()); |
| 1062 | + |
| 1063 | + v8::Local<v8::Array> type_list = |
| 1064 | + Nan::New<v8::Array>(names_and_types.types[i].size); |
| 1065 | + for (int j = 0; j < names_and_types.types[i].size; ++j) { |
| 1066 | + Nan::Set( |
| 1067 | + type_list, j, |
| 1068 | + Nan::New(names_and_types.types[i].data[j]).ToLocalChecked()); |
| 1069 | + } |
| 1070 | + item->Set(Nan::New("types").ToLocalChecked(), type_list); |
| 1071 | + Nan::Set(*result_list, i, item); |
| 1072 | + } |
| 1073 | +} |
| 1074 | + |
| 1075 | +NAN_METHOD(GetPublisherNamesAndTypesByNode) { |
| 1076 | + RclHandle* node_handle = RclHandle::Unwrap<RclHandle>(info[0]->ToObject()); |
| 1077 | + rcl_node_t* node = reinterpret_cast<rcl_node_t*>(node_handle->ptr()); |
| 1078 | + std::string node_name = *Nan::Utf8String(info[1]->ToString()); |
| 1079 | + std::string node_namespace = *Nan::Utf8String(info[2]->ToString()); |
| 1080 | + bool no_demangle = Nan::To<bool>(info[3]).FromJust(); |
| 1081 | + |
| 1082 | + rcl_names_and_types_t topic_names_and_types = |
| 1083 | + rcl_get_zero_initialized_names_and_types(); |
| 1084 | + rcl_allocator_t allocator = rcl_get_default_allocator(); |
| 1085 | + THROW_ERROR_IF_NOT_EQUAL( |
| 1086 | + RCL_RET_OK, |
| 1087 | + rcl_get_publisher_names_and_types_by_node(node, &allocator, no_demangle, |
| 1088 | + node_name.c_str(), node_namespace.c_str(), &topic_names_and_types), |
| 1089 | + "Failed to get_publisher_names_and_types."); |
| 1090 | + |
| 1091 | + v8::Local<v8::Array> result_list = |
| 1092 | + Nan::New<v8::Array>(topic_names_and_types.names.size); |
| 1093 | + ExtractNamesAndTypes(topic_names_and_types, &result_list); |
| 1094 | + |
| 1095 | + THROW_ERROR_IF_NOT_EQUAL( |
| 1096 | + RCL_RET_OK, |
| 1097 | + rcl_names_and_types_fini(&topic_names_and_types), |
| 1098 | + "Failed to destroy topic_names_and_types"); |
| 1099 | + |
| 1100 | + info.GetReturnValue().Set(result_list); |
| 1101 | +} |
| 1102 | + |
| 1103 | +NAN_METHOD(GetSubscriptionNamesAndTypesByNode) { |
| 1104 | + RclHandle* node_handle = RclHandle::Unwrap<RclHandle>(info[0]->ToObject()); |
| 1105 | + rcl_node_t* node = reinterpret_cast<rcl_node_t*>(node_handle->ptr()); |
| 1106 | + std::string node_name = *Nan::Utf8String(info[1]->ToString()); |
| 1107 | + std::string node_namespace = *Nan::Utf8String(info[2]->ToString()); |
| 1108 | + bool no_demangle = Nan::To<bool>(info[3]).FromJust(); |
| 1109 | + |
| 1110 | + rcl_names_and_types_t topic_names_and_types = |
| 1111 | + rcl_get_zero_initialized_names_and_types(); |
| 1112 | + rcl_allocator_t allocator = rcl_get_default_allocator(); |
| 1113 | + THROW_ERROR_IF_NOT_EQUAL( |
| 1114 | + RCL_RET_OK, |
| 1115 | + rcl_get_subscriber_names_and_types_by_node(node, &allocator, no_demangle, |
| 1116 | + node_name.c_str(), node_namespace.c_str(), &topic_names_and_types), |
| 1117 | + "Failed to get_publisher_names_and_types."); |
| 1118 | + |
| 1119 | + v8::Local<v8::Array> result_list = |
| 1120 | + Nan::New<v8::Array>(topic_names_and_types.names.size); |
| 1121 | + ExtractNamesAndTypes(topic_names_and_types, &result_list); |
| 1122 | + |
| 1123 | + THROW_ERROR_IF_NOT_EQUAL( |
| 1124 | + RCL_RET_OK, |
| 1125 | + rcl_names_and_types_fini(&topic_names_and_types), |
| 1126 | + "Failed to destroy topic_names_and_types"); |
| 1127 | + |
| 1128 | + info.GetReturnValue().Set(result_list); |
| 1129 | +} |
| 1130 | + |
| 1131 | +NAN_METHOD(GetServiceNamesAndTypesByNode) { |
| 1132 | + RclHandle* node_handle = RclHandle::Unwrap<RclHandle>(info[0]->ToObject()); |
| 1133 | + rcl_node_t* node = reinterpret_cast<rcl_node_t*>(node_handle->ptr()); |
| 1134 | + std::string node_name = *Nan::Utf8String(info[1]->ToString()); |
| 1135 | + std::string node_namespace = *Nan::Utf8String(info[2]->ToString()); |
| 1136 | + |
| 1137 | + rcl_names_and_types_t service_names_and_types = |
| 1138 | + rcl_get_zero_initialized_names_and_types(); |
| 1139 | + rcl_allocator_t allocator = rcl_get_default_allocator(); |
| 1140 | + THROW_ERROR_IF_NOT_EQUAL( |
| 1141 | + RCL_RET_OK, |
| 1142 | + rcl_get_service_names_and_types_by_node(node, &allocator, |
| 1143 | + node_name.c_str(), node_namespace.c_str(), &service_names_and_types), |
| 1144 | + "Failed to get_publisher_names_and_types."); |
| 1145 | + |
| 1146 | + v8::Local<v8::Array> result_list = |
| 1147 | + Nan::New<v8::Array>(service_names_and_types.names.size); |
| 1148 | + ExtractNamesAndTypes(service_names_and_types, &result_list); |
| 1149 | + |
| 1150 | + THROW_ERROR_IF_NOT_EQUAL( |
| 1151 | + RCL_RET_OK, |
| 1152 | + rcl_names_and_types_fini(&service_names_and_types), |
| 1153 | + "Failed to destroy topic_names_and_types"); |
| 1154 | + |
| 1155 | + info.GetReturnValue().Set(result_list); |
| 1156 | +} |
| 1157 | + |
| 1158 | +NAN_METHOD(GetTopicNamesAndTypes) { |
| 1159 | + RclHandle* node_handle = RclHandle::Unwrap<RclHandle>(info[0]->ToObject()); |
| 1160 | + rcl_node_t* node = reinterpret_cast<rcl_node_t*>(node_handle->ptr()); |
| 1161 | + bool no_demangle = Nan::To<bool>(info[1]).FromJust(); |
| 1162 | + rcl_names_and_types_t topic_names_and_types = |
| 1163 | + rcl_get_zero_initialized_names_and_types(); |
| 1164 | + rcl_allocator_t allocator = rcl_get_default_allocator(); |
| 1165 | + |
| 1166 | + THROW_ERROR_IF_NOT_EQUAL( |
| 1167 | + RCL_RET_OK, |
| 1168 | + rcl_get_topic_names_and_types(node, &allocator, no_demangle, |
| 1169 | + &topic_names_and_types), |
| 1170 | + "Failed to get_publisher_names_and_types."); |
| 1171 | + |
| 1172 | + v8::Local<v8::Array> result_list = |
| 1173 | + Nan::New<v8::Array>(topic_names_and_types.names.size); |
| 1174 | + ExtractNamesAndTypes(topic_names_and_types, &result_list); |
| 1175 | + |
| 1176 | + THROW_ERROR_IF_NOT_EQUAL( |
| 1177 | + RCL_RET_OK, |
| 1178 | + rcl_names_and_types_fini(&topic_names_and_types), |
| 1179 | + "Failed to destroy topic_names_and_types"); |
| 1180 | + |
| 1181 | + info.GetReturnValue().Set(result_list); |
| 1182 | +} |
| 1183 | + |
| 1184 | +NAN_METHOD(GetServiceNamesAndTypes) { |
| 1185 | + RclHandle* node_handle = RclHandle::Unwrap<RclHandle>(info[0]->ToObject()); |
| 1186 | + rcl_node_t* node = reinterpret_cast<rcl_node_t*>(node_handle->ptr()); |
| 1187 | + rcl_names_and_types_t service_names_and_types = |
| 1188 | + rcl_get_zero_initialized_names_and_types(); |
| 1189 | + rcl_allocator_t allocator = rcl_get_default_allocator(); |
| 1190 | + |
| 1191 | + THROW_ERROR_IF_NOT_EQUAL( |
| 1192 | + RCL_RET_OK, |
| 1193 | + rcl_get_service_names_and_types(node, &allocator, &service_names_and_types), |
| 1194 | + "Failed to get_publisher_names_and_types."); |
| 1195 | + |
| 1196 | + v8::Local<v8::Array> result_list = |
| 1197 | + Nan::New<v8::Array>(service_names_and_types.names.size); |
| 1198 | + ExtractNamesAndTypes(service_names_and_types, &result_list); |
| 1199 | + |
| 1200 | + THROW_ERROR_IF_NOT_EQUAL( |
| 1201 | + RCL_RET_OK, |
| 1202 | + rcl_names_and_types_fini(&service_names_and_types), |
| 1203 | + "Failed to destroy topic_names_and_types"); |
| 1204 | + |
| 1205 | + info.GetReturnValue().Set(result_list); |
| 1206 | +} |
| 1207 | + |
1054 | 1208 | uint32_t GetBindingMethodsCount(BindingMethod* methods) { |
1055 | 1209 | uint32_t count = 0; |
1056 | 1210 | while (methods[count].function) { |
@@ -1109,6 +1263,11 @@ BindingMethod binding_methods[] = { |
1109 | 1263 | {"isEnableFor", IsEnableFor}, |
1110 | 1264 | {"createContext", CreateContext}, |
1111 | 1265 | {"ok", IsContextValid}, |
| 1266 | + {"getPublisherNamesAndTypesByNode", GetPublisherNamesAndTypesByNode}, |
| 1267 | + {"getSubscriptionNamesAndTypesByNode", GetSubscriptionNamesAndTypesByNode}, |
| 1268 | + {"getServiceNamesAndTypesByNode", GetServiceNamesAndTypesByNode}, |
| 1269 | + {"getTopicNamesAndTypes", GetTopicNamesAndTypes}, |
| 1270 | + {"getServiceNamesAndTypes", GetServiceNamesAndTypes}, |
1112 | 1271 | {"", nullptr}}; |
1113 | 1272 |
|
1114 | 1273 | } // namespace rclnodejs |
0 commit comments