|
@@ -26,6 +26,7 @@
|
|
|
#include "ua_types_generated_handling.h"
|
|
|
#include "ua_types_encoding_binary.h"
|
|
|
#include "ua_types_encoding_json.h"
|
|
|
+#include "ua_pubsub_networkmessage.h"
|
|
|
|
|
|
static UA_StatusCode
|
|
|
encode(const UA_ByteString *buf, UA_ByteString *out,
|
|
@@ -99,6 +100,71 @@ decode(const UA_ByteString *buf, UA_ByteString *out,
|
|
|
return UA_STATUSCODE_GOOD;
|
|
|
}
|
|
|
|
|
|
+#ifdef UA_ENABLE_PUBSUB
|
|
|
+
|
|
|
+static UA_StatusCode
|
|
|
+encodeNetworkMessage(const UA_ByteString *buf, UA_ByteString *out) {
|
|
|
+ size_t offset = 0;
|
|
|
+ UA_NetworkMessage msg;
|
|
|
+ UA_StatusCode retval = UA_NetworkMessage_decodeBinary(buf, &offset, &msg);
|
|
|
+ if(retval != UA_STATUSCODE_GOOD)
|
|
|
+ return retval;
|
|
|
+
|
|
|
+ if(offset != buf->length) {
|
|
|
+ UA_NetworkMessage_deleteMembers(&msg);
|
|
|
+ fprintf(stderr, "Input buffer not completely read\n");
|
|
|
+ return UA_STATUSCODE_BADINTERNALERROR;
|
|
|
+ }
|
|
|
+
|
|
|
+ size_t jsonLength = UA_NetworkMessage_calcSizeJson(&msg, NULL, 0, NULL, 0, true);
|
|
|
+ retval = UA_ByteString_allocBuffer(out, jsonLength);
|
|
|
+ if(retval != UA_STATUSCODE_GOOD) {
|
|
|
+ UA_NetworkMessage_deleteMembers(&msg);
|
|
|
+ return retval;
|
|
|
+ }
|
|
|
+
|
|
|
+ uint8_t *bufPos = &out->data[0];
|
|
|
+ const uint8_t *bufEnd = &out->data[out->length];
|
|
|
+ retval = UA_NetworkMessage_encodeJson(&msg, &bufPos, &bufEnd, NULL, 0, NULL, 0, true);
|
|
|
+ UA_NetworkMessage_deleteMembers(&msg);
|
|
|
+ if(retval != UA_STATUSCODE_GOOD) {
|
|
|
+ UA_ByteString_deleteMembers(out);
|
|
|
+ return retval;
|
|
|
+ }
|
|
|
+
|
|
|
+ out->length = (size_t)((uintptr_t)bufPos - (uintptr_t)out->data);
|
|
|
+ return UA_STATUSCODE_GOOD;
|
|
|
+}
|
|
|
+
|
|
|
+static UA_StatusCode
|
|
|
+decodeNetworkMessage(const UA_ByteString *buf, UA_ByteString *out) {
|
|
|
+ UA_NetworkMessage msg;
|
|
|
+ UA_StatusCode retval = UA_NetworkMessage_decodeJson(&msg, buf);
|
|
|
+ if(retval != UA_STATUSCODE_GOOD)
|
|
|
+ return retval;
|
|
|
+
|
|
|
+ size_t binLength = UA_NetworkMessage_calcSizeBinary(&msg);
|
|
|
+ retval = UA_ByteString_allocBuffer(out, binLength);
|
|
|
+ if(retval != UA_STATUSCODE_GOOD) {
|
|
|
+ UA_NetworkMessage_deleteMembers(&msg);
|
|
|
+ return retval;
|
|
|
+ }
|
|
|
+
|
|
|
+ uint8_t *bufPos = &out->data[0];
|
|
|
+ const uint8_t *bufEnd = &out->data[out->length];
|
|
|
+ retval = UA_NetworkMessage_encodeBinary(&msg, &bufPos, bufEnd);
|
|
|
+ UA_NetworkMessage_deleteMembers(&msg);
|
|
|
+ if(retval != UA_STATUSCODE_GOOD) {
|
|
|
+ UA_ByteString_deleteMembers(out);
|
|
|
+ return retval;
|
|
|
+ }
|
|
|
+
|
|
|
+ out->length = (size_t)((uintptr_t)bufPos - (uintptr_t)out->data);
|
|
|
+ return UA_STATUSCODE_GOOD;
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
static void
|
|
|
usage(void) {
|
|
|
printf("Usage: ua2json [encode|decode] [-t dataType] [-o outputFile] [inputFile]\n"
|
|
@@ -111,6 +177,7 @@ usage(void) {
|
|
|
|
|
|
int main(int argc, char **argv) {
|
|
|
UA_Boolean encode_option = true;
|
|
|
+ UA_Boolean pubsub = false;
|
|
|
const char *datatype_option = "Variant";
|
|
|
const char *input_option = NULL;
|
|
|
const char *output_option = NULL;
|
|
@@ -172,15 +239,19 @@ int main(int argc, char **argv) {
|
|
|
|
|
|
/* Find the data type */
|
|
|
const UA_DataType *type = NULL;
|
|
|
- for(size_t i = 0; i < UA_TYPES_COUNT; ++i) {
|
|
|
- if(strcmp(datatype_option, UA_TYPES[i].typeName) == 0) {
|
|
|
- type = &UA_TYPES[i];
|
|
|
- break;
|
|
|
+ if(strcmp(datatype_option, "PubSub") == 0) {
|
|
|
+ pubsub = true;
|
|
|
+ } else {
|
|
|
+ for(size_t i = 0; i < UA_TYPES_COUNT; ++i) {
|
|
|
+ if(strcmp(datatype_option, UA_TYPES[i].typeName) == 0) {
|
|
|
+ type = &UA_TYPES[i];
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(!type) {
|
|
|
+ fprintf(stderr, "Error: Datatype not found\n");
|
|
|
+ return -1;
|
|
|
}
|
|
|
- }
|
|
|
- if(!type) {
|
|
|
- fprintf(stderr, "Error: Datatype not found\n");
|
|
|
- return -1;
|
|
|
}
|
|
|
|
|
|
/* Open files */
|
|
@@ -232,11 +303,20 @@ int main(int argc, char **argv) {
|
|
|
buf.length = pos;
|
|
|
|
|
|
/* Convert */
|
|
|
- UA_StatusCode result;
|
|
|
- if(encode_option)
|
|
|
+ UA_StatusCode result = UA_STATUSCODE_BADNOTIMPLEMENTED;
|
|
|
+#ifdef UA_ENABLE_PUBSUB
|
|
|
+ if(pubsub && encode_option) {
|
|
|
+ result = encodeNetworkMessage(&buf, &outbuf);
|
|
|
+ } else if(pubsub) {
|
|
|
+ result = decodeNetworkMessage(&buf, &outbuf);
|
|
|
+ } else
|
|
|
+#endif
|
|
|
+ if(encode_option) {
|
|
|
result = encode(&buf, &outbuf, type);
|
|
|
- else
|
|
|
+ } else {
|
|
|
result = decode(&buf, &outbuf, type);
|
|
|
+ }
|
|
|
+
|
|
|
if(result != UA_STATUSCODE_GOOD) {
|
|
|
fprintf(stderr, "Error: Parsing failed with code %s\n",
|
|
|
UA_StatusCode_name(result));
|