xmlreader/source/xmlreader.cxx                                    |   88 
+++++-----
 xmlsecurity/inc/biginteger.hxx                                    |    8 
 xmlsecurity/qa/unit/signing/signing.cxx                           |   12 -
 xmlsecurity/source/component/documentdigitalsignatures.cxx        |    2 
 xmlsecurity/source/helper/xmlsignaturehelper.cxx                  |    4 
 xmlsecurity/source/helper/xsecverify.cxx                          |    6 
 xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx |    4 
 xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx         |   21 +-
 8 files changed, 75 insertions(+), 70 deletions(-)

New commits:
commit 89559c8bc7fe8afd9e8d99d6ef8bac5a57bf6e04
Author:     Pragat Pandya <[email protected]>
AuthorDate: Thu Dec 25 10:59:32 2025 +0530
Commit:     Hossein <[email protected]>
CommitDate: Mon Dec 29 19:39:46 2025 +0100

    tdf#168771 Convert enum to enum class in xmlreader and xmlsecurity
    
    Converted plain enums to enum class for better type safety:
    
    - xmlreader: Converted two local Space enums to enum class and removed
      redundant SPACE_ prefix from enum values (NONE, SPAN, BREAK, START)
    - xmlsecurity: Converted EqualMode enum to enum class
    - xmlsecurity: Converted local State enum in CompatDNCryptoAPI to enum class
    
    Updated all usages across 8 files to use scoped enum syntax.
    
    Change-Id: I27fd7280bccad72a43cda3b669b1f0926c34271c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196207
    Tested-by: Jenkins
    Reviewed-by: Hossein <[email protected]>

diff --git a/xmlreader/source/xmlreader.cxx b/xmlreader/source/xmlreader.cxx
index ac4f9ad3b325..2b16ee207fcf 100644
--- a/xmlreader/source/xmlreader.cxx
+++ b/xmlreader/source/xmlreader.cxx
@@ -495,42 +495,42 @@ Span XmlReader::handleAttributeValue(
             --end;
         }
         char const * p = begin;
-        enum Space { SPACE_NONE, SPACE_SPAN, SPACE_BREAK };
+        enum class Space { None, Span, Break };
             // a single true space character can go into the current span,
             // everything else breaks the span
-        Space space = SPACE_NONE;
+        Space space = Space::None;
         while (p != end) {
             switch (*p) {
             case '\x09':
             case '\x0A':
             case '\x0D':
                 switch (space) {
-                case SPACE_NONE:
+                case Space::None:
                     pad_.add(begin, p - begin);
                     pad_.add(" ");
-                    space = SPACE_BREAK;
+                    space = Space::Break;
                     break;
-                case SPACE_SPAN:
+                case Space::Span:
                     pad_.add(begin, p - begin);
-                    space = SPACE_BREAK;
+                    space = Space::Break;
                     break;
-                case SPACE_BREAK:
+                case Space::Break:
                     break;
                 }
                 begin = ++p;
                 break;
             case ' ':
                 switch (space) {
-                case SPACE_NONE:
+                case Space::None:
                     ++p;
-                    space = SPACE_SPAN;
+                    space = Space::Span;
                     break;
-                case SPACE_SPAN:
+                case Space::Span:
                     pad_.add(begin, p - begin);
                     begin = ++p;
-                    space = SPACE_BREAK;
+                    space = Space::Break;
                     break;
-                case SPACE_BREAK:
+                case Space::Break:
                     begin = ++p;
                     break;
                 }
@@ -539,11 +539,11 @@ Span XmlReader::handleAttributeValue(
                 pad_.add(begin, p - begin);
                 p = handleReference(p, end);
                 begin = p;
-                space = SPACE_NONE;
+                space = Space::None;
                 break;
             default:
                 ++p;
-                space = SPACE_NONE;
+                space = Space::None;
                 break;
             }
         }
@@ -800,10 +800,10 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * 
text) {
     pad_.clear();
     char const * flowBegin = pos_;
     char const * flowEnd = pos_;
-    enum Space { SPACE_START, SPACE_NONE, SPACE_SPAN, SPACE_BREAK };
+    enum class Space { Start, None, Span, Break };
         // a single true space character can go into the current flow,
         // everything else breaks the flow
-    Space space = SPACE_START;
+    Space space = Space::Start;
     for (;;) {
         switch (peek()) {
         case '
@@ -813,39 +813,39 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * 
text) {
         case '\x0A':
         case '\x0D':
             switch (space) {
-            case SPACE_START:
-            case SPACE_BREAK:
+            case Space::Start:
+            case Space::Break:
                 break;
-            case SPACE_NONE:
-            case SPACE_SPAN:
-                space = SPACE_BREAK;
+            case Space::None:
+            case Space::Span:
+                space = Space::Break;
                 break;
             }
             ++pos_;
             break;
         case ' ':
             switch (space) {
-            case SPACE_START:
-            case SPACE_BREAK:
+            case Space::Start:
+            case Space::Break:
                 break;
-            case SPACE_NONE:
-                space = SPACE_SPAN;
+            case Space::None:
+                space = Space::Span;
                 break;
-            case SPACE_SPAN:
-                space = SPACE_BREAK;
+            case Space::Span:
+                space = Space::Break;
                 break;
             }
             ++pos_;
             break;
         case '&':
             switch (space) {
-            case SPACE_START:
+            case Space::Start:
                 break;
-            case SPACE_NONE:
-            case SPACE_SPAN:
+            case Space::None:
+            case Space::Span:
                 pad_.add(flowBegin, pos_ - flowBegin);
                 break;
-            case SPACE_BREAK:
+            case Space::Break:
                 pad_.add(flowBegin, flowEnd - flowBegin);
                 pad_.add(" ");
                 break;
@@ -853,7 +853,7 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * 
text) {
             pos_ = handleReference(pos_, end_);
             flowBegin = pos_;
             flowEnd = pos_;
-            space = SPACE_NONE;
+            space = Space::None;
             break;
         case '<':
             ++pos_;
@@ -861,7 +861,7 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * 
text) {
             case '!':
                 ++pos_;
                 if (skipComment()) {
-                    space = SPACE_BREAK;
+                    space = Space::Break;
                 } else {
                     Span cdata(scanCdataSection());
                     if (cdata.is()) {
@@ -869,13 +869,13 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * 
text) {
                         // references; it keeps the code simple), but it might
                         // arguably be better to normalize it:
                         switch (space) {
-                        case SPACE_START:
+                        case Space::Start:
                             break;
-                        case SPACE_NONE:
-                        case SPACE_SPAN:
+                        case Space::None:
+                        case Space::Span:
                             pad_.add(flowBegin, pos_ - flowBegin);
                             break;
-                        case SPACE_BREAK:
+                        case Space::Break:
                             pad_.add(flowBegin, flowEnd - flowBegin);
                             pad_.add(" ");
                             break;
@@ -883,7 +883,7 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * 
text) {
                         normalizeLineEnds(cdata);
                         flowBegin = pos_;
                         flowEnd = pos_;
-                        space = SPACE_NONE;
+                        space = Space::None;
                     } else {
                         skipDocumentTypeDeclaration();
                     }
@@ -898,7 +898,7 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * 
text) {
             case '?':
                 ++pos_;
                 skipProcessingInstruction();
-                space = SPACE_BREAK;
+                space = Space::Break;
                 break;
             default:
                 pad_.add(flowBegin, flowEnd - flowBegin);
@@ -909,20 +909,20 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * 
text) {
             break;
         default:
             switch (space) {
-            case SPACE_START:
+            case Space::Start:
                 flowBegin = pos_;
                 break;
-            case SPACE_NONE:
-            case SPACE_SPAN:
+            case Space::None:
+            case Space::Span:
                 break;
-            case SPACE_BREAK:
+            case Space::Break:
                 pad_.add(flowBegin, flowEnd - flowBegin);
                 pad_.add(" ");
                 flowBegin = pos_;
                 break;
             }
             flowEnd = ++pos_;
-            space = SPACE_NONE;
+            space = Space::None;
             break;
         }
     }
diff --git a/xmlsecurity/inc/biginteger.hxx b/xmlsecurity/inc/biginteger.hxx
index fc99320c7ea2..5a5e599a369c 100644
--- a/xmlsecurity/inc/biginteger.hxx
+++ b/xmlsecurity/inc/biginteger.hxx
@@ -38,11 +38,11 @@ numericStringToBigInteger(std::u16string_view serialNumber);
 // DNs read as strings from XML files may need to be mangled for compatibility
 // as NSS and MS CryptoAPI have different string serialisations; if the DN is
 // from an XCertificate it's "native" already and doesn't need to be mangled.
-enum EqualMode
+enum class EqualMode
 {
-    NOCOMPAT,
-    COMPAT_2ND,
-    COMPAT_BOTH
+    NoCompat,
+    Compat2nd,
+    CompatBoth
 };
 XSECXMLSEC_DLLPUBLIC bool EqualDistinguishedNames(std::u16string_view rName1,
                                                   std::u16string_view rName2, 
EqualMode eMode);
diff --git a/xmlsecurity/qa/unit/signing/signing.cxx 
b/xmlsecurity/qa/unit/signing/signing.cxx
index 91a0f95b719c..9938780541f7 100644
--- a/xmlsecurity/qa/unit/signing/signing.cxx
+++ b/xmlsecurity/qa/unit/signing/signing.cxx
@@ -612,13 +612,17 @@ CPPUNIT_TEST_FIXTURE(SigningTest, testDNCompatibility)
     static constexpr OUString msDN(u"CN=\"\"\"ABC\"\".\", O=\"Enterprise 
\"\"ABC\"\"\""_ustr);
     static constexpr OUString nssDN(u"CN=\\"ABC\\".,O=Enterprise 
\\"ABC\\""_ustr);
     // this is just the status quo, possibly either NSS or CryptoAPI might 
change
-    CPPUNIT_ASSERT(!xmlsecurity::EqualDistinguishedNames(msDN, nssDN, 
xmlsecurity::NOCOMPAT));
-    CPPUNIT_ASSERT(!xmlsecurity::EqualDistinguishedNames(nssDN, msDN, 
xmlsecurity::NOCOMPAT));
+    CPPUNIT_ASSERT(
+        !xmlsecurity::EqualDistinguishedNames(msDN, nssDN, 
xmlsecurity::EqualMode::NoCompat));
+    CPPUNIT_ASSERT(
+        !xmlsecurity::EqualDistinguishedNames(nssDN, msDN, 
xmlsecurity::EqualMode::NoCompat));
     // with compat flag it should work, with the string one 2nd and the native 
one 1st
 #ifdef _WIN32
-    CPPUNIT_ASSERT(xmlsecurity::EqualDistinguishedNames(msDN, nssDN, 
xmlsecurity::COMPAT_2ND));
+    CPPUNIT_ASSERT(
+        xmlsecurity::EqualDistinguishedNames(msDN, nssDN, 
xmlsecurity::EqualMode::Compat2nd));
 #else
-    CPPUNIT_ASSERT(xmlsecurity::EqualDistinguishedNames(nssDN, msDN, 
xmlsecurity::COMPAT_2ND));
+    CPPUNIT_ASSERT(
+        xmlsecurity::EqualDistinguishedNames(nssDN, msDN, 
xmlsecurity::EqualMode::Compat2nd));
 #endif
 }
 
diff --git a/xmlsecurity/source/component/documentdigitalsignatures.cxx 
b/xmlsecurity/source/component/documentdigitalsignatures.cxx
index 22dc147e6c33..a43cec7dc6bb 100644
--- a/xmlsecurity/source/component/documentdigitalsignatures.cxx
+++ b/xmlsecurity/source/component/documentdigitalsignatures.cxx
@@ -625,7 +625,7 @@ sal_Bool DocumentDigitalSignatures::isAuthorTrusted(
 
     return std::any_of(aTrustedAuthors.begin(), aTrustedAuthors.end(),
         [this, &xAuthor, &sSerialNum](const SvtSecurityOptions::Certificate& 
rAuthor) {
-            if (!xmlsecurity::EqualDistinguishedNames(rAuthor.SubjectName, 
xAuthor->getIssuerName(), xmlsecurity::NOCOMPAT))
+            if (!xmlsecurity::EqualDistinguishedNames(rAuthor.SubjectName, 
xAuthor->getIssuerName(), xmlsecurity::EqualMode::NoCompat))
                 return false;
             if (rAuthor.SerialNumber != sSerialNum)
                 return false;
diff --git a/xmlsecurity/source/helper/xmlsignaturehelper.cxx 
b/xmlsecurity/source/helper/xmlsignaturehelper.cxx
index 1510af12a83a..929de6773a06 100644
--- a/xmlsecurity/source/helper/xmlsignaturehelper.cxx
+++ b/xmlsecurity/source/helper/xmlsignaturehelper.cxx
@@ -608,7 +608,7 @@ static auto CheckX509Data(
                 start = i; // issuer isn't in the list
                 break;
             }
-            if 
(xmlsecurity::EqualDistinguishedNames(certs[i]->getIssuerName(), 
certs[j]->getSubjectName(), xmlsecurity::NOCOMPAT))
+            if 
(xmlsecurity::EqualDistinguishedNames(certs[i]->getIssuerName(), 
certs[j]->getSubjectName(), xmlsecurity::EqualMode::NoCompat))
             {
                 if (i == j) // self signed
                 {
@@ -641,7 +641,7 @@ static auto CheckX509Data(
             if (chain[i] != j)
             {
                 if (xmlsecurity::EqualDistinguishedNames(
-                        certs[chain[i]]->getSubjectName(), 
certs[j]->getIssuerName(), xmlsecurity::NOCOMPAT))
+                        certs[chain[i]]->getSubjectName(), 
certs[j]->getIssuerName(), xmlsecurity::EqualMode::NoCompat))
                 {
                     if (chain.size() != i + 1) // already found issue?
                     {
diff --git a/xmlsecurity/source/helper/xsecverify.cxx 
b/xmlsecurity/source/helper/xsecverify.cxx
index 055b7aad3a0b..c191cddb318d 100644
--- a/xmlsecurity/source/helper/xsecverify.cxx
+++ b/xmlsecurity/source/helper/xsecverify.cxx
@@ -265,7 +265,7 @@ void XSecController::setX509Data(
             OUString const 
serialNumber(xmlsecurity::bigIntegerToNumericString(xCert->getSerialNumber()));
             auto const iter = std::find_if(rX509IssuerSerials.begin(), 
rX509IssuerSerials.end(),
                 [&](auto const& rX509IssuerSerial) {
-                    return xmlsecurity::EqualDistinguishedNames(issuerName, 
rX509IssuerSerial.first, xmlsecurity::COMPAT_2ND)
+                    return xmlsecurity::EqualDistinguishedNames(issuerName, 
rX509IssuerSerial.first, xmlsecurity::EqualMode::Compat2nd)
                         && serialNumber == rX509IssuerSerial.second;
                 });
             if (iter != rX509IssuerSerials.end())
@@ -412,7 +412,7 @@ void XSecController::setX509CertDigest(
     {
         for (auto & it : rData)
         {
-            if (xmlsecurity::EqualDistinguishedNames(it.X509IssuerName, 
rX509IssuerName, xmlsecurity::COMPAT_BOTH)
+            if (xmlsecurity::EqualDistinguishedNames(it.X509IssuerName, 
rX509IssuerName, xmlsecurity::EqualMode::CompatBoth)
                 && it.X509SerialNumber == rX509SerialNumber)
             {
                 it.CertDigest = rCertDigest;
@@ -435,7 +435,7 @@ void XSecController::setX509CertDigest(
                     {
                         SAL_INFO("xmlsecurity.helper", "cannot parse 
X509Certificate");
                     }
-                    else if 
(xmlsecurity::EqualDistinguishedNames(xCert->getIssuerName(), rX509IssuerName, 
xmlsecurity::COMPAT_2ND)
+                    else if 
(xmlsecurity::EqualDistinguishedNames(xCert->getIssuerName(), rX509IssuerName, 
xmlsecurity::EqualMode::Compat2nd)
                         && 
xmlsecurity::bigIntegerToNumericString(xCert->getSerialNumber()) == 
rX509SerialNumber)
                     {
                         it.CertDigest = rCertDigest;
diff --git a/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx 
b/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx
index ab2ca947fda9..01fcb90a2635 100644
--- a/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx
+++ b/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx
@@ -859,7 +859,7 @@ bool EqualDistinguishedNames(
         std::u16string_view const rName1, std::u16string_view const rName2,
         EqualMode const eMode)
 {
-    if (eMode == COMPAT_BOTH && !rName1.empty() && rName1 == rName2)
+    if (eMode == EqualMode::CompatBoth && !rName1.empty() && rName1 == rName2)
     {   // handle case where both need to be converted
         return true;
     }
@@ -876,7 +876,7 @@ bool EqualDistinguishedNames(
             &blob1, &blob2) == TRUE;
         delete[] blob2.pbData;
     }
-    if (!ret && eMode == COMPAT_2ND)
+    if (!ret && eMode == EqualMode::Compat2nd)
     {
         CERT_NAME_BLOB blob2compat;
         if (!EncodeDistinguishedName(CompatDNNSS(OUString(rName2)), 
blob2compat))
diff --git a/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx 
b/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx
index bed7772c5791..7983078012ad 100644
--- a/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx
+++ b/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx
@@ -502,10 +502,11 @@ namespace xmlsecurity {
 static OUString CompatDNCryptoAPI(std::u16string_view rDN)
 {
     OUStringBuffer buf(rDN.size());
-    enum { DEFAULT, INVALUE, INQUOTE } state(DEFAULT);
+    enum class State { Default, InValue, InQuote };
+    State state(State::Default);
     for (size_t i = 0; i < rDN.size(); ++i)
     {
-        if (state == DEFAULT)
+        if (state == State::Default)
         {
             buf.append(rDN[i]);
             if (rDN[i] == '=')
@@ -518,25 +519,25 @@ static OUString CompatDNCryptoAPI(std::u16string_view rDN)
                 {
                     buf.append(rDN[i+1]);
                     ++i;
-                    state = INQUOTE;
+                    state = State::InQuote;
                 }
                 else
                 {
-                    state = INVALUE;
+                    state = State::InValue;
                 }
             }
         }
-        else if (state == INVALUE)
+        else if (state == State::InValue)
         {
             if (rDN[i] == '+' || rDN[i] == ',' || rDN[i] == ';')
             {
-                state = DEFAULT;
+                state = State::Default;
             }
             buf.append(rDN[i]);
         }
         else
         {
-            assert(state == INQUOTE);
+            assert(state == State::InQuote);
             if (rDN[i] == '"')
             {
                 if (rDN.size() != i+1 && rDN[i+1] == '"')
@@ -547,7 +548,7 @@ static OUString CompatDNCryptoAPI(std::u16string_view rDN)
                 else
                 {
                     buf.append(rDN[i]);
-                    state = DEFAULT;
+                    state = State::Default;
                 }
             }
             else
@@ -563,7 +564,7 @@ bool EqualDistinguishedNames(
         std::u16string_view const rName1, std::u16string_view const rName2,
         EqualMode const eMode)
 {
-    if (eMode == COMPAT_BOTH && !rName1.empty() && rName1 == rName2)
+    if (eMode == EqualMode::CompatBoth && !rName1.empty() && rName1 == rName2)
     {   // handle case where both need to be converted
         return true;
     }
@@ -579,7 +580,7 @@ bool EqualDistinguishedNames(
         ret = (CERT_CompareName(pName1, pName2) == SECEqual);
         CERT_DestroyName(pName2);
     }
-    if (!ret && eMode == COMPAT_2ND)
+    if (!ret && eMode == EqualMode::Compat2nd)
     {
         CERTName *const pName2Compat(CERT_AsciiToName(OUStringToOString(
             CompatDNCryptoAPI(rName2), RTL_TEXTENCODING_UTF8).getStr()));

Reply via email to