aboutsummaryrefslogtreecommitdiffstats
path: root/src/net
diff options
context:
space:
mode:
Diffstat (limited to 'src/net')
-rw-r--r--src/net/smtp/SMTPResponse.cpp69
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