aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFSystemError.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2018-08-14 01:48:02 +0200
committerJay Berkenbilt <ejb@ql.org>2018-08-14 02:01:51 +0200
commitb4bdc42b4fd627529e1c4a4636d1631254a2f26e (patch)
tree4a3526842ce36c08fef94ec7f60da585a505d6ce /libqpdf/QPDFSystemError.cc
parent164cbdde46d7ec6924782a60f346a6a465a79a26 (diff)
downloadqpdf-b4bdc42b4fd627529e1c4a4636d1631254a2f26e.tar.zst
New exception class QPDFSystemError (fixes #221)
Diffstat (limited to 'libqpdf/QPDFSystemError.cc')
-rw-r--r--libqpdf/QPDFSystemError.cc51
1 files changed, 51 insertions, 0 deletions
diff --git a/libqpdf/QPDFSystemError.cc b/libqpdf/QPDFSystemError.cc
new file mode 100644
index 00000000..094341cd
--- /dev/null
+++ b/libqpdf/QPDFSystemError.cc
@@ -0,0 +1,51 @@
+#include <qpdf/QPDFSystemError.hh>
+#include <qpdf/QUtil.hh>
+#include <string.h>
+
+QPDFSystemError::QPDFSystemError(std::string const& description,
+ int system_errno) :
+ std::runtime_error(createWhat(description, system_errno)),
+ description(description),
+ system_errno(system_errno)
+{
+}
+
+QPDFSystemError::~QPDFSystemError() throw ()
+{
+}
+
+std::string
+QPDFSystemError::createWhat(std::string const& description,
+ int system_errno)
+{
+ std::string message;
+#ifdef _MSC_VER
+ // "94" is mentioned in the MSVC docs, but it's still safe if the
+ // message is longer. strerror_s is a templated function that
+ // knows the size of buf and truncates.
+ char buf[94];
+ if (strerror_s(buf, errno) != 0)
+ {
+ message = description + ": failed with an unknown error";
+ }
+ else
+ {
+ message = description + ": " + buf;
+ }
+#else
+ message = description + ": " + strerror(errno);
+#endif
+ return message;
+}
+
+std::string const&
+QPDFSystemError::getDescription() const
+{
+ return this->description;
+}
+
+int
+QPDFSystemError::getErrno() const
+{
+ return this->system_errno;
+}