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 86 87 | //This IF statement IF xDecode AND xEncode THEN //ERROR xDecodeDone := FALSE; xDecodeBusy := FALSE; xDecodeError := TRUE; eDecodeError := ERROR.PayloadYouCantDoBothAtOnce; xEncodeDone := FALSE; xEncodeBusy := FALSE; xEncodeError := TRUE; eEncodeError := ERROR.PayloadYouCantDoBothAtOnce; //OK, now we are listening to the user as to how many bytes in the payload _diPayloadSize := protobufBlobSize; SetArrayBounds(); eDecodeState := PayloadDecodeStates.payload_getmember; i := _protobufBlobLower + _diPayloadSize - 1; //break out of FOR eDecodeState := PayloadDecodeStates.payload_gettimestamp; eDecodeState := PayloadDecodeStates.payload_getmetric; eDecodeState := PayloadDecodeStates.payload_getseq; eDecodeState := PayloadDecodeStates.payload_getUuid; eDecodeState := PayloadDecodeStates.payload_getBody; ELSE //extension... error xDecodeError := TRUE; i := _protobufBlobLower + _diPayloadSize - 1; //break out of FOR END_CASE PayloadDecodeStates.payload_gettimestamp: _xHasTimeStamp := TRUE; eDecodeState := PayloadDecodeStates.payload_getmember; PayloadDecodeStates.payload_getmetric: recentlyClaimedMetric REF= AddMetricBlank( eError => eDecodeError ); IF eDecodeError = ERROR.NO_ERROR THEN THIS^.recentlyClaimedMetric( xDecode := TRUE, protobufBlobMaxIndex := _protobufBlobLower + _diPayloadSize - 1, ProtobufBlobIndex := i, xDecodeDone =>, xDecodeError =>, //SUCCESS! the latest Metric has now been decoded eDecodeState := PayloadDecodeStates.payload_getmember; ELSE IF recentlyClaimedMetric.xDecodeError THEN eDecodeError := ERROR.PayloadMetricBusyButMultiCycleNotYetImplemented; END_IF i := _protobufBlobLower + _diPayloadSize - 1; //break out of FOR END_IF; PayloadDecodeStates.payload_getseq: _xHasSeq := TRUE; eDecodeState := PayloadDecodeStates.payload_getmember; PayloadDecodeStates.payload_getUuid: _xHasUuid := TRUE; DecodeNextBinaryData( numBytes => _diHasBody_bytes, eDecodeError := ERROR.OhMy_ThatShouldNotHaveHappened i := _protobufBlobLower + _diPayloadSize - 1; //break out of FOR NO IDEA WHAT TO DO HERE END_CASE END_FOR eDecodeState := PayloadDecodeStates.idle; xDecodeDone := NOT xDecodeError; END_IF; //NOTE: BLOB Data will not be initialized to 00. InitializeBlob(); //Encode Timestamp (Field Number 1) dviTemp.uliDateTime := _uliTimestamp; eEncodeError := EncodeNextVarInt( ValueToEncode := dviTemp, ProtobufFieldNumber := 1 ); END_IF; _Metrics.ItterateRestart( HasNext => _COL_HasNext ); _Metrics.ItterateNext( itfElement => _COL_Element, IF __QUERYPOINTER( _COL_Element, nextMetricToEncode^( xDecode := FALSE, ProtobufBlobIndex := i, protobufBlobMaxIndex := _protobufBlobUpper, xDecodeDone =>, xDecodeError =>, xEncodeDone =>, xEncodeError => xEncodeError, eEncodeError => eEncodeError ); END_WHILE IF eEncodeError = ERROR.NO_ERROR AND _xHasSeq THEN //Encode UUID //Encode Body IF eEncodeError = ERROR.NO_ERROR AND _xHasBody THEN _diPayloadSize := i - _protobufBlobLower; //DONE :) xEncodeBusy := FALSE; {a9ed5b7e-75c5-4651-af16-d2c27e98cb94} It contains code to transform either from or to the raw bytes IF BOTH xDecode and xEncode are set, an error will be given for both and nothing will happen {attribute 'hide'} VAR_INPUT |