Branch data Line data Source code
1 : : /* SPDX-FileCopyrightText: Copyright 2026 Cozens Software Solutions Limited
2 : : * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0 OR LicenseRef-COSOSO-Commercial
3 : : */
4 : :
5 : : #include "SolidSyslogOriginSd.h"
6 : :
7 : : #include <stddef.h>
8 : :
9 : : #include "SolidSyslogError.h"
10 : : #include "SolidSyslogNullSd.h"
11 : : #include "SolidSyslogOriginSdErrors.h"
12 : : #include "SolidSyslogOriginSdPrivate.h"
13 : : #include "SolidSyslogSdElement.h"
14 : : #include "SolidSyslogSdValue.h"
15 : : #include "SolidSyslogStructuredDataDefinition.h"
16 : :
17 : : const struct SolidSyslogErrorSource SolidSyslogOriginSdErrorSource = {"OriginSd", SolidSyslogOriginSdErrors_Name};
18 : :
19 : : static void OriginSd_Format(struct SolidSyslogStructuredData* base, struct SolidSyslogSdElement* element);
20 : :
21 : : static inline struct SolidSyslogOriginSd* OriginSd_SelfFromBase(struct SolidSyslogStructuredData* base);
22 : : static inline void OriginSd_EmitSoftware(struct SolidSyslogSdElement* element, const char* software);
23 : : static inline void OriginSd_EmitSwVersion(struct SolidSyslogSdElement* element, const char* swVersion);
24 : : static inline void OriginSd_EmitEnterpriseId(struct SolidSyslogSdElement* element, const char* enterpriseId);
25 : : static inline void OriginSd_EmitIps(struct SolidSyslogSdElement* element, const struct SolidSyslogOriginSd* self);
26 : :
27 : 130 : void SolidSyslogOriginSd_Initialise(
28 : : struct SolidSyslogStructuredData* base,
29 : : const struct SolidSyslogOriginSdConfig* config
30 : : )
31 : : {
32 : 130 : struct SolidSyslogOriginSd* self = OriginSd_SelfFromBase(base);
33 : 130 : self->Base.Format = OriginSd_Format;
34 : 130 : self->Software = config->Software;
35 : 130 : self->SwVersion = config->SwVersion;
36 : 130 : self->EnterpriseId = config->EnterpriseId;
37 : 130 : self->GetIpCount = config->GetIpCount;
38 : 130 : self->GetIpAt = config->GetIpAt;
39 : 130 : self->IpContext = config->IpContext;
40 : 130 : }
41 : :
42 : 130 : void SolidSyslogOriginSd_Cleanup(struct SolidSyslogStructuredData* base)
43 : : {
44 : : /* Overwrite the abstract base with the shared NullSd vtable so use-after-destroy
45 : : * is a safe no-op. Derived fields are private to this TU; the next SolidSyslogOriginSd_Initialise
46 : : * overwrites them. */
47 : 130 : *base = *SolidSyslogNullSd_Get();
48 : 130 : }
49 : :
50 : 78 : static void OriginSd_Format(struct SolidSyslogStructuredData* base, struct SolidSyslogSdElement* element)
51 : : {
52 : 78 : const struct SolidSyslogOriginSd* self = OriginSd_SelfFromBase(base);
53 : :
54 : 78 : SolidSyslogSdElement_Begin(element, "origin", 0U);
55 : 78 : OriginSd_EmitSoftware(element, self->Software);
56 : 78 : OriginSd_EmitSwVersion(element, self->SwVersion);
57 : 78 : OriginSd_EmitEnterpriseId(element, self->EnterpriseId);
58 : 78 : OriginSd_EmitIps(element, self);
59 : 78 : SolidSyslogSdElement_End(element);
60 : 78 : }
61 : :
62 : 208 : static inline struct SolidSyslogOriginSd* OriginSd_SelfFromBase(struct SolidSyslogStructuredData* base)
63 : : {
64 : 208 : return (struct SolidSyslogOriginSd*) base;
65 : : }
66 : :
67 : 78 : static inline void OriginSd_EmitSoftware(struct SolidSyslogSdElement* element, const char* software)
68 : : {
69 [ + + ]: 78 : if (software != NULL)
70 : : {
71 : 73 : SolidSyslogSdValue_BoundedString(
72 : : SolidSyslogSdElement_Param(element, "software"),
73 : : software,
74 : : ORIGIN_SOFTWARE_MAX
75 : : );
76 : : }
77 : 78 : }
78 : :
79 : 78 : static inline void OriginSd_EmitSwVersion(struct SolidSyslogSdElement* element, const char* swVersion)
80 : : {
81 [ + + ]: 78 : if (swVersion != NULL)
82 : : {
83 : 73 : SolidSyslogSdValue_BoundedString(
84 : : SolidSyslogSdElement_Param(element, "swVersion"),
85 : : swVersion,
86 : : ORIGIN_SWVERSION_MAX
87 : : );
88 : : }
89 : 78 : }
90 : :
91 : 78 : static inline void OriginSd_EmitEnterpriseId(struct SolidSyslogSdElement* element, const char* enterpriseId)
92 : : {
93 [ + + ]: 78 : if (enterpriseId != NULL)
94 : : {
95 : 51 : SolidSyslogSdValue_BoundedString(
96 : : SolidSyslogSdElement_Param(element, "enterpriseId"),
97 : : enterpriseId,
98 : : ORIGIN_ENTERPRISE_ID_MAX
99 : : );
100 : : }
101 : 78 : }
102 : :
103 : 78 : static inline void OriginSd_EmitIps(struct SolidSyslogSdElement* element, const struct SolidSyslogOriginSd* self)
104 : : {
105 [ + + + + ]: 78 : if ((self->GetIpCount != NULL) && (self->GetIpAt != NULL))
106 : : {
107 : 53 : size_t count = self->GetIpCount(self->IpContext);
108 [ + + ]: 107 : for (size_t i = 0U; i < count; i++)
109 : : {
110 : 54 : self->GetIpAt(SolidSyslogSdElement_Param(element, "ip"), self->IpContext, i);
111 : : }
112 : : }
113 : 78 : }
|