diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/net/smtp/SMTPResponse.cpp | 69 |
1 files changed, 66 insertions, 3 deletions
diff --git a/src/net/smtp/SMTPResponse.cpp b/src/net/smtp/SMTPResponse.cpp index 91923339..86a7a7bd 100644 --- a/src/net/smtp/SMTPResponse.cpp +++ b/src/net/smtp/SMTPResponse.cpp @@ -35,6 +35,8 @@ #include "vmime/net/socket.hpp" #include "vmime/net/timeoutHandler.hpp" +#include <cctype> + namespace vmime { namespace net { @@ -71,6 +73,12 @@ int SMTPResponse::getCode() const } +const SMTPResponse::enhancedStatusCode SMTPResponse::getEnhancedCode() const +{ + return m_lines[m_lines.size() - 1].getEnhancedCode(); +} + + const string SMTPResponse::getText() const { string text = m_lines[0].getText(); @@ -175,7 +183,7 @@ const SMTPResponse::responseLine SMTPResponse::getNextResponse() else text = ""; - return responseLine(code, text); + return responseLine(code, text, extractEnhancedCode(text)); } @@ -195,6 +203,33 @@ int SMTPResponse::extractResponseCode(const string& response) } +// static +const SMTPResponse::enhancedStatusCode SMTPResponse::extractEnhancedCode(const string& responseText) +{ + enhancedStatusCode enhCode; + + std::istringstream iss(responseText); + + if (std::isdigit(iss.peek())) + { + iss >> enhCode.klass; + + if (iss.get() == '.' && std::isdigit(iss.peek())) + { + iss >> enhCode.subject; + + if (iss.get() == '.' && std::isdigit(iss.peek())) + { + iss >> enhCode.detail; + return enhCode; + } + } + } + + return enhancedStatusCode(); // no enhanced code found +} + + const SMTPResponse::responseLine SMTPResponse::getLineAt(const size_t pos) const { return m_lines[pos]; @@ -225,8 +260,8 @@ const SMTPResponse::state SMTPResponse::getCurrentState() const // SMTPResponse::responseLine -SMTPResponse::responseLine::responseLine(const int code, const string& text) - : m_code(code), m_text(text) +SMTPResponse::responseLine::responseLine(const int code, const string& text, const enhancedStatusCode& enhCode) + : m_code(code), m_text(text), m_enhCode(enhCode) { } @@ -243,6 +278,18 @@ int SMTPResponse::responseLine::getCode() const } +void SMTPResponse::responseLine::setEnhancedCode(const enhancedStatusCode& enhCode) +{ + m_enhCode = enhCode; +} + + +const SMTPResponse::enhancedStatusCode SMTPResponse::responseLine::getEnhancedCode() const +{ + return m_enhCode; +} + + void SMTPResponse::responseLine::setText(const string& text) { m_text = text; @@ -255,6 +302,22 @@ const string SMTPResponse::responseLine::getText() const } + +// SMTPResponse::enhancedStatusCode + + +SMTPResponse::enhancedStatusCode::enhancedStatusCode() + : klass(0), subject(0), detail(0) +{ +} + + +SMTPResponse::enhancedStatusCode::enhancedStatusCode(const enhancedStatusCode& enhCode) + : klass(enhCode.klass), subject(enhCode.subject), detail(enhCode.detail) +{ +} + + } // smtp } // net } // vmime |