From 9d03dcd0814e1d80238a3605defc3263c31562ba Mon Sep 17 00:00:00 2001 From: Jan Fellner Date: Wed, 8 Jul 2026 09:33:20 +0200 Subject: [PATCH 1/3] Remove YAML front matter and agent callout from ReadMe.md. Keep GitHub landing-page docs human-facing; agent routing stays in AGENTS.md and Cursor rules. Co-authored-by: Cursor --- ReadMe.md | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index 08783e0..4bb0ab5 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,23 +1,3 @@ ---- -title: estos Enhanced Sample Neufeld ASN C Compiler -scope: estos-esnacc -owner_repo: esnacc -entry_for: - - ASN.1 compiler development - - target-language code generation - - protocol documentation generation -purpose: Explain how to build and use the enhanced ASN.1 compiler and its generated targets. -read_when: - - Changing compiler behavior or generated output - - Updating build instructions - - Investigating TypeScript, C++, C, C#, Java, Kotlin, Swift, JSDoc, IDL, or OpenAPI generation -related_docs: - - AGENTS.md - - FAQ.md - - samples/readme.md - - cpp-lib/tests/runtime_correctness_notes.md ---- - # estos Enhanced Sample Neufeld ASN C Compiler This is the estos enhanced sample neufeld asn c compiler. It is an functional enriched fork of the original enhanced sample neufeld asn c compiler offering: @@ -65,8 +45,6 @@ Those two languages offer JSON and BER encoding for the transport layer, a compl Other languages just offer to get created structures which need to get serialized / deserialized in JSON with other functions of the language. # Getting started -Agents and contributors: start with [AGENTS.md](AGENTS.md) for repository routing and task-specific documentation entry points. - You need to compile the compiler or use a precompiled version of it. The samples folder offers examples on the usage for the different supported languages. These folders show some sample asn1 files, the command line and the expected output of the compiler. See [samples/readme.md](samples/readme.md) for the current TypeScript microservice sample layout and required Node/pnpm setup. From a163e2e8be12ad5c3fd99c8714d0bdcf739e533a Mon Sep 17 00:00:00 2001 From: Jan Fellner Date: Mon, 13 Jul 2026 14:34:23 +0200 Subject: [PATCH 2/3] UCAAS-1440 fixed SendEvent operationName in telemetry missing clang-formatted some files --- cpp-lib/include/SnaccROSEBase.h | 2 +- cpp-lib/include/SnaccROSEInterfaces.h | 2 +- cpp-lib/include/SnaccTelemetry.h | 8 +- cpp-lib/src/SnaccROSEBase.cpp | 172 +++++++------------------- 4 files changed, 52 insertions(+), 132 deletions(-) diff --git a/cpp-lib/include/SnaccROSEBase.h b/cpp-lib/include/SnaccROSEBase.h index 09da43c..dfae470 100644 --- a/cpp-lib/include/SnaccROSEBase.h +++ b/cpp-lib/include/SnaccROSEBase.h @@ -461,4 +461,4 @@ class SnaccROSEBase : public SnaccROSESender, public SnaccTelemetryCallback long Send(SNACC::ROSEInvoke* pInvoke, const char* szOperationName, SnaccInvokeContext& ctx, size_t* pstRequestData = nullptr); }; -#endif //_SnaccROSEBase_h_ \ No newline at end of file +#endif //_SnaccROSEBase_h_ diff --git a/cpp-lib/include/SnaccROSEInterfaces.h b/cpp-lib/include/SnaccROSEInterfaces.h index 45a9ea7..b5e023b 100644 --- a/cpp-lib/include/SnaccROSEInterfaces.h +++ b/cpp-lib/include/SnaccROSEInterfaces.h @@ -324,4 +324,4 @@ class ISnaccROSETransport virtual long SendBinaryDataBlockEx(const char* lpBytes, size_t size, SnaccInvokeContext& ctx) = 0; }; -#endif //_SnaccROSEInterfaces_h_ \ No newline at end of file +#endif //_SnaccROSEInterfaces_h_ diff --git a/cpp-lib/include/SnaccTelemetry.h b/cpp-lib/include/SnaccTelemetry.h index fc35734..f09447e 100644 --- a/cpp-lib/include/SnaccTelemetry.h +++ b/cpp-lib/include/SnaccTelemetry.h @@ -122,15 +122,11 @@ class SnaccTelemetryData // Creates the telemetry object in shared ownership so it can be forwarded safely. static std::shared_ptr Create(Direction direction, unsigned int uiOperationID, const char* szOperationName, size_t stRequestData, std::chrono::steady_clock::time_point chronoCreated = std::chrono::steady_clock::now()); - static std::shared_ptr CreateFinalized(Direction direction, unsigned int uiOperationID, const char* szOperationName, size_t stRequestData, Outcome outcome, Stage stage, Reason reason, - long lRoseResult, - std::optional stResponseData = std::nullopt, std::shared_ptr pctx = {}, - std::chrono::steady_clock::time_point chronoCreated = std::chrono::steady_clock::now()); + static std::shared_ptr CreateFinalized(Direction direction, unsigned int uiOperationID, const char* szOperationName, size_t stRequestData, Outcome outcome, Stage stage, Reason reason, long lRoseResult, std::optional stResponseData = std::nullopt, std::shared_ptr pctx = {}, std::chrono::steady_clock::time_point chronoCreated = std::chrono::steady_clock::now()); // Finalizes the telemetry data once the local request lifecycle has completed. // For events pass Outcome::EVENT and leave stResponseData empty. - void finalize(Outcome outcome, Stage stage, Reason reason, std::optional lRoseResult = std::nullopt, std::optional stResponseData = std::nullopt, - std::shared_ptr pctx = {}); + void finalize(Outcome outcome, Stage stage, Reason reason, std::optional lRoseResult = std::nullopt, std::optional stResponseData = std::nullopt, std::shared_ptr pctx = {}); // Immutable request metadata captured when the lifecycle starts. const Direction m_Direction{}; diff --git a/cpp-lib/src/SnaccROSEBase.cpp b/cpp-lib/src/SnaccROSEBase.cpp index 61103dc..bf28fea 100644 --- a/cpp-lib/src/SnaccROSEBase.cpp +++ b/cpp-lib/src/SnaccROSEBase.cpp @@ -305,15 +305,7 @@ const char* SnaccROSEBase::InboundInvokeRejectContext::OperationNameCStr() const void SnaccROSEBase::EmitInboundDecodeFailureTelemetry(unsigned long ulMessageSize, unsigned int uiOperationID, const char* szOperationName, SnaccTelemetryData::Outcome outcome, long lTelemetryResult) { - OnInvokeProcessed(SnaccTelemetryData::CreateFinalized( - SnaccTelemetryData::Direction::INBOUND, - uiOperationID, - szOperationName, - ulMessageSize, - outcome, - SnaccTelemetryData::Stage::INBOUND_DECODE, - SnaccTelemetryData::Reason::DECODE_FAILED, - lTelemetryResult)); + OnInvokeProcessed(SnaccTelemetryData::CreateFinalized(SnaccTelemetryData::Direction::INBOUND, uiOperationID, szOperationName, ulMessageSize, outcome, SnaccTelemetryData::Stage::INBOUND_DECODE, SnaccTelemetryData::Reason::DECODE_FAILED, lTelemetryResult)); } void SnaccROSEBase::EmitInboundGenericDecodeFailureTelemetry(unsigned long ulMessageSize) @@ -348,8 +340,7 @@ SnaccROSEBase::InboundDecodeFailureResult SnaccROSEBase::HandleInboundRoseDecode reject.reject->invokeProblem = new InvokeProblem(SNACC::InvokeProblem::mistypedArgument); reject.details = UTF8String::CreateNewFromASCII(strRejectDetails.c_str()); - auto pRejectCtx = SnaccInvokeContext::Create( - SnaccInvokeContextInit(SnaccInvokeDirection::INBOUND, nullptr, rejectCtx->OperationNameCStr())); + auto pRejectCtx = SnaccInvokeContext::Create(SnaccInvokeContextInit(SnaccInvokeDirection::INBOUND, nullptr, rejectCtx->OperationNameCStr())); const long lRejectResult = SendRejectEx(&reject, *pRejectCtx); if (lRejectResult == ROSE_NOERROR) { @@ -361,17 +352,7 @@ SnaccROSEBase::InboundDecodeFailureResult SnaccROSEBase::HandleInboundRoseDecode return result; } -void SnaccROSEBase::HandleInboundEnvelopeSnaccDecodeFailure( - SNACC::TransportEncoding transportEncoding, - SNACC::TransportEncoding hookEncoding, - const char* lpBytes, - unsigned long ulMessageSize, - bool& bLogTransportData, - const SNACC::SnaccException& ex, - const std::optional& rejectCtx, - bool bSendReject, - bool bRejectDetailsFromPrettyJson, - const char* szMethod) +void SnaccROSEBase::HandleInboundEnvelopeSnaccDecodeFailure(SNACC::TransportEncoding transportEncoding, SNACC::TransportEncoding hookEncoding, const char* lpBytes, unsigned long ulMessageSize, bool& bLogTransportData, const SNACC::SnaccException& ex, const std::optional& rejectCtx, bool bSendReject, bool bRejectDetailsFromPrettyJson, const char* szMethod) { if (bLogTransportData) bLogTransportData = LogTransportData(false, transportEncoding, nullptr, lpBytes, ulMessageSize, nullptr, nullptr); @@ -389,13 +370,7 @@ void SnaccROSEBase::HandleInboundEnvelopeSnaccDecodeFailure( EmitInboundDecodeFailureTelemetry(ulMessageSize, failure.uiOperationID, failure.szOperationName, failure.outcome, failure.lTelemetryResult); } -void SnaccROSEBase::HandleInboundJsonParseDecodeFailure( - SNACC::TransportEncoding transportEncoding, - const char* lpBytes, - unsigned long ulMessageSize, - bool& bLogTransportData, - const std::string& parseError, - const char* szMethod) +void SnaccROSEBase::HandleInboundJsonParseDecodeFailure(SNACC::TransportEncoding transportEncoding, const char* lpBytes, unsigned long ulMessageSize, bool& bLogTransportData, const std::string& parseError, const char* szMethod) { if (bLogTransportData) bLogTransportData = LogTransportData(false, transportEncoding, nullptr, lpBytes, ulMessageSize, nullptr, nullptr); @@ -831,17 +806,7 @@ bool SnaccROSEBase::OnBinaryDataBlockResult(const char* lpBytes, unsigned long l } catch (const SnaccException& ex) { - HandleInboundEnvelopeSnaccDecodeFailure( - m_eTransportEncoding, - SNACC::TransportEncoding::BER, - lpBytes, - lSize, - bLogTransportData, - ex, - rejectCtx, - false, - false, - __FUNCTION__); + HandleInboundEnvelopeSnaccDecodeFailure(m_eTransportEncoding, SNACC::TransportEncoding::BER, lpBytes, lSize, bLogTransportData, ex, rejectCtx, false, false, __FUNCTION__); return true; } break; @@ -869,29 +834,13 @@ bool SnaccROSEBase::OnBinaryDataBlockResult(const char* lpBytes, unsigned long l } catch (const SnaccException& ex) { - HandleInboundEnvelopeSnaccDecodeFailure( - m_eTransportEncoding, - m_eTransportEncoding, - lpBytes, - lSize, - bLogTransportData, - ex, - rejectCtx, - false, - true, - __FUNCTION__); + HandleInboundEnvelopeSnaccDecodeFailure(m_eTransportEncoding, m_eTransportEncoding, lpBytes, lSize, bLogTransportData, ex, rejectCtx, false, true, __FUNCTION__); return true; } } else { - HandleInboundJsonParseDecodeFailure( - m_eTransportEncoding, - lpBytes, - lSize, - bLogTransportData, - reader.getFormattedErrorMessages(), - __FUNCTION__); + HandleInboundJsonParseDecodeFailure(m_eTransportEncoding, lpBytes, lSize, bLogTransportData, reader.getFormattedErrorMessages(), __FUNCTION__); } break; } @@ -1019,17 +968,7 @@ void SnaccROSEBase::OnBinaryDataBlock(const char* lpBytes, unsigned long ulSize, } catch (const SnaccException& ex) { - HandleInboundEnvelopeSnaccDecodeFailure( - m_eTransportEncoding, - SNACC::TransportEncoding::BER, - lpBytes, - ulSize, - bLogTransportData, - ex, - rejectCtx, - true, - false, - __FUNCTION__); + HandleInboundEnvelopeSnaccDecodeFailure(m_eTransportEncoding, SNACC::TransportEncoding::BER, lpBytes, ulSize, bLogTransportData, ex, rejectCtx, true, false, __FUNCTION__); } break; } @@ -1055,28 +994,12 @@ void SnaccROSEBase::OnBinaryDataBlock(const char* lpBytes, unsigned long ulSize, } catch (const SnaccException& ex) { - HandleInboundEnvelopeSnaccDecodeFailure( - m_eTransportEncoding, - m_eTransportEncoding, - lpBytes, - ulSize, - bLogTransportData, - ex, - rejectCtx, - true, - true, - __FUNCTION__); + HandleInboundEnvelopeSnaccDecodeFailure(m_eTransportEncoding, m_eTransportEncoding, lpBytes, ulSize, bLogTransportData, ex, rejectCtx, true, true, __FUNCTION__); } } else { - HandleInboundJsonParseDecodeFailure( - m_eTransportEncoding, - lpBytes, - ulSize, - bLogTransportData, - reader.getFormattedErrorMessages(), - __FUNCTION__); + HandleInboundJsonParseDecodeFailure(m_eTransportEncoding, lpBytes, ulSize, bLogTransportData, reader.getFormattedErrorMessages(), __FUNCTION__); } break; } @@ -1108,47 +1031,47 @@ bool SnaccROSEBase::OnROSEMessage(std::unique_ptr pMessage, switch (pMessage->choiceId) { case ROSEMessage::invokeCid: - { - auto& invoke = *pMessage->invoke; - if (bAllowAllInvokes || m_multithreadInvokeIDs.find(invoke.operationID) != m_multithreadInvokeIDs.end()) { - if (invoke.operationName && invoke.operationID == 0) - invoke.operationID = SnaccRoseOperationLookup::LookUpID(invoke.operationName->getASCII().c_str()); + auto& invoke = *pMessage->invoke; + if (bAllowAllInvokes || m_multithreadInvokeIDs.find(invoke.operationID) != m_multithreadInvokeIDs.end()) + { + if (invoke.operationName && invoke.operationID == 0) + invoke.operationID = SnaccRoseOperationLookup::LookUpID(invoke.operationName->getASCII().c_str()); - if (invoke.operationID || invoke.operationName) - OnInvokeMessage(std::move(pMessage), ulMessageSize); + if (invoke.operationID || invoke.operationName) + OnInvokeMessage(std::move(pMessage), ulMessageSize); - bProcessed = true; + bProcessed = true; + } + break; } - break; - } case ROSEMessage::resultCid: - { - const int invokeID = pMessage->result->invokeID; - OnResultMessage(*pMessage->result, ulMessageSize); - CompletePendingOperation(invokeID, std::move(pMessage), ulMessageSize); - return true; - } + { + const int invokeID = pMessage->result->invokeID; + OnResultMessage(*pMessage->result, ulMessageSize); + CompletePendingOperation(invokeID, std::move(pMessage), ulMessageSize); + return true; + } case ROSEMessage::errorCid: - { - const int invokeID = pMessage->error->invokedID; - OnErrorMessage(*pMessage->error, ulMessageSize); - CompletePendingOperation(invokeID, std::move(pMessage), ulMessageSize); - return true; - } - case ROSEMessage::rejectCid: - { - auto& reject = *pMessage->reject; - OnRejectMessage(reject, ulMessageSize); - if (reject.invokedID.choiceId == ROSERejectChoice::invokedIDCid && reject.invokedID.invokedID != nullptr) { - const int invokeID = *reject.invokedID.invokedID; + const int invokeID = pMessage->error->invokedID; + OnErrorMessage(*pMessage->error, ulMessageSize); CompletePendingOperation(invokeID, std::move(pMessage), ulMessageSize); return true; } - bProcessed = true; - break; - } + case ROSEMessage::rejectCid: + { + auto& reject = *pMessage->reject; + OnRejectMessage(reject, ulMessageSize); + if (reject.invokedID.choiceId == ROSERejectChoice::invokedIDCid && reject.invokedID.invokedID != nullptr) + { + const int invokeID = *reject.invokedID.invokedID; + CompletePendingOperation(invokeID, std::move(pMessage), ulMessageSize); + return true; + } + bProcessed = true; + break; + } default: break; } @@ -1474,6 +1397,10 @@ long SnaccROSEBase::Send(SNACC::ROSEInvoke* pInvoke, const char* szOperationName } else { + // You need to specify the transport encoding when the connection is setup + // The connection is no longer defaulting to BER. This needs to be set explicit. + // Inbound connections adopt the encoding as soon as the first payload is received + ASSERT(0); throw std::runtime_error("invalid m_eTransportEncoding"); } @@ -1483,16 +1410,13 @@ long SnaccROSEBase::Send(SNACC::ROSEInvoke* pInvoke, const char* szOperationName long SnaccROSEBase::SendEvent(SNACC::ROSEInvoke* pInvoke, const char* szOperationName, std::shared_ptr pCtx /*= {}*/) { const auto chronoCreated = std::chrono::steady_clock::now(); - const char* szResolvedOperationName = SnaccRoseOperationLookup::LookUpName(pInvoke->operationID); if (!pCtx) - { - SnaccInvokeContextInit init(SnaccInvokeDirection::OUTBOUND, pInvoke, szResolvedOperationName ? szResolvedOperationName : szOperationName); - pCtx = CreateInvokeContext(init); - } + pCtx = CreateInvokeContext(SnaccInvokeContextInit(SnaccInvokeDirection::OUTBOUND, pInvoke, szOperationName)); auto& ctx = *pCtx; + size_t stRequestData = 0; const long lRoseResult = IsProcessingAllowed() ? Send(pInvoke, szOperationName, ctx, &stRequestData) : ROSE_TE_SHUTDOWN; - auto telemetry = SnaccTelemetryData::Create(SnaccTelemetryData::Direction::OUTBOUND, pInvoke->operationID, szResolvedOperationName, stRequestData, chronoCreated); + auto telemetry = SnaccTelemetryData::Create(SnaccTelemetryData::Direction::OUTBOUND, pInvoke->operationID, szOperationName, stRequestData, chronoCreated); telemetry->finalize(lRoseResult == ROSE_NOERROR ? SnaccTelemetryData::Outcome::EVENT : SnaccTelemetryData::Outcome::UNHANDLED, SnaccTelemetryData::Stage::OUTBOUND_SEND, lRoseResult == ROSE_NOERROR ? SnaccTelemetryData::Reason::LOCAL_EVENT : GetUnhandledReasonFromResult(lRoseResult), lRoseResult, std::nullopt, pCtx); OnInvokeProcessed(telemetry); return lRoseResult; From cf1d51945f319a519296bcaea44d299636c85340 Mon Sep 17 00:00:00 2001 From: Jan Fellner Date: Mon, 13 Jul 2026 14:36:01 +0200 Subject: [PATCH 3/3] Bump version to 7.0.7 (release 13.07.2026). Co-authored-by: Cursor --- version.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/version.h b/version.h index 357e845..a7b04e9 100644 --- a/version.h +++ b/version.h @@ -1,8 +1,8 @@ #ifndef VERSION_H #define VERSION_H -#define VERSION "7.0.6" -#define VERSION_RC 7, 0, 6 -#define RELDATE "07.07.2026" +#define VERSION "7.0.7" +#define VERSION_RC 7, 0, 7 +#define RELDATE "13.07.2026" #endif // VERSION_H