1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | ELSIF NOT xDecode AND NOT xEncode THEN //DO NOTHING, ALL OUTPUTS OFF xDecodeError:=FALSE; eDecodeError := ERROR.NO_ERROR; xEncodeError:=FALSE; eEncodeError := ERROR.NO_ERROR; ELSIF xDecode AND NOT xEncode THEN //Decode xDecodeBusy:=TRUE; ELSIF NOT xDecode AND xEncode THEN //Encode xEncodeBusy:=TRUE; END_IF% IF xDecodeBusy THEN InitializeStructure(); eDecodeState := PayloadDecodeStates.object_getlength; //decode length FOR ProtobufBlobIndex := ProtobufBlobIndex TO finalByteIndex DO CASE eDecodeState OF PayloadDecodeStates.object_getmember: CASE myProtobufBlob[ProtobufBlobIndex] OF 16#00://end of data? padding byte? ERROR xDecodeError := TRUE; eDecodeError := ERROR.PayloadFound00; eDecodeState := PayloadDecodeStates.object_getis_historical; ProtobufedId.Metric_is_transient: eDecodeState := PayloadDecodeStates.object_getis_transient; ProtobufedId.Metric_is_null: eDecodeState := PayloadDecodeStates.object_getis_null; ProtobufedId.Metric_metadata: eDecodeState := PayloadDecodeStates.object_getboolean_value; ProtobufedId.Metric_string_value: eDecodeState := PayloadDecodeStates.object_getstring_value; ProtobufedId.Metric_bytes_value[0]: ProtobufedId.Metric_dataset_value[0]: ProtobufedId.Metric_template_value[0]: ProtobufedId.Metric_extension_value[0]: eDecodeError := ERROR.PayloadFoundExtensions; ELSE //extension... error END_CASE PayloadDecodeStates.object_getname : _xHasName := TRUE; dviTemp := OwnerPayload.DecodeNextVarInt(); //updates i to end of the varint _uliAlias := dviTemp.Uint64; PayloadDecodeStates.object_gettimestamp : _xHasTimeStamp := TRUE; _uliTimestamp := dviTemp.uliDateTime; PayloadDecodeStates.object_gettype : _xHasDatatype := TRUE; _udiDatatype := dviTemp.UInt32; PayloadDecodeStates.object_getint_value : _eHasValue := MetricProtobufsType.int_value; _rValue := OwnerPayload.DecodeNextFloat(); //updates i to end of the varint PayloadDecodeStates.object_getdouble_value : _eHasValue := MetricProtobufsType.double_value; _sValue := OwnerPayload.DecodeNextString(); //updates i to end of the string PayloadDecodeStates.object_getis_historical : _xHasIs_historical := TRUE; PayloadDecodeStates.object_getis_transient : _xIs_transient := dviTemp.Boolean; _xHasIs_null := TRUE; PayloadDecodeStates.object_getmetadata_length : _metadataendindex := dviTemp.Int32 + ProtobufBlobIndex; ELSE END_IF ProtobufedId.MetaData_is_multi_part : eDecodeState := PayloadDecodeStates.object_getMetaData_is_multi_part; ProtobufedId.MetaData_size : eDecodeState := PayloadDecodeStates.object_getMetaData_size; eDecodeState := PayloadDecodeStates.object_getMetaData_seq; ProtobufedId.MetaData_file_type : eDecodeState := PayloadDecodeStates.object_getMetaData_file_type; eDecodeState := PayloadDecodeStates.object_getMetaData_md5; PayloadDecodeStates.object_getMetaData_is_multi_part : _myMetaData.is_multi_part := dviTemp.Boolean; _myHasMetaData.xHasContent_type := TRUE; _myMetaData.content_type := OwnerPayload.DecodeNextString(); //updates i to end of the string _myHasMetaData.xHasSize := TRUE; PayloadDecodeStates.object_getMetaData_seq : _myMetaData.seq := dviTemp.UInt64; _myHasMetaData.xHasFile_name := TRUE; _myMetaData.file_name := OwnerPayload.DecodeNextString(); //updates i to end of the string _myHasMetaData.xHasFile_type := TRUE; _myMetaData.file_type := OwnerPayload.DecodeNextString(); //updates i to end of the string _myHasMetaData.xHasMd5 := TRUE; _myMetaData.md5 := OwnerPayload.DecodeNextString(); //updates i to end of the string _myHasMetaData.xHasDescription := TRUE; |