summaryrefslogtreecommitdiff
path: root/tools/debugserver/source/DNBError.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/debugserver/source/DNBError.cpp')
-rw-r--r--tools/debugserver/source/DNBError.cpp128
1 files changed, 128 insertions, 0 deletions
diff --git a/tools/debugserver/source/DNBError.cpp b/tools/debugserver/source/DNBError.cpp
new file mode 100644
index 0000000000000..c9d8ebd58d894
--- /dev/null
+++ b/tools/debugserver/source/DNBError.cpp
@@ -0,0 +1,128 @@
+//===-- DNBError.cpp --------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Created by Greg Clayton on 6/26/07.
+//
+//===----------------------------------------------------------------------===//
+
+#include "DNBError.h"
+#include "CFString.h"
+#include "DNBLog.h"
+#include "PThreadMutex.h"
+
+#ifdef WITH_SPRINGBOARD
+#include <SpringBoardServices/SpringBoardServer.h>
+#endif
+
+const char *
+DNBError::AsString() const
+{
+ if (Success())
+ return NULL;
+
+ if (m_str.empty())
+ {
+ const char *s = NULL;
+ switch (m_flavor)
+ {
+ case MachKernel:
+ s = ::mach_error_string (m_err);
+ break;
+
+ case POSIX:
+ s = ::strerror (m_err);
+ break;
+
+#ifdef WITH_SPRINGBOARD
+ case SpringBoard:
+ {
+ CFStringRef statusStr = SBSApplicationLaunchingErrorString (m_err);
+ if (CFString::UTF8 (statusStr, m_str) == NULL)
+ m_str.clear();
+ }
+ break;
+#endif
+#ifdef WITH_BKS
+ case BackBoard:
+ {
+ // You have to call ObjC routines to get the error string from BackBoardServices.
+ // Not sure I want to make DNBError.cpp an .mm file. For now just make sure you
+ // pre-populate the error string when you make the DNBError of type BackBoard.
+ m_str.assign("Should have set BackBoard error when making the error string.");
+ }
+ break;
+#endif
+#ifdef WITH_FBS
+ case FrontBoard:
+ {
+ // You have to call ObjC routines to get the error string from FrontBoardServices.
+ // Not sure I want to make DNBError.cpp an .mm file. For now just make sure you
+ // pre-populate the error string when you make the DNBError of type FrontBoard.
+ m_str.assign("Should have set FrontBoard error when making the error string.");
+ }
+ break;
+#endif
+ default:
+ break;
+ }
+ if (s)
+ m_str.assign(s);
+ }
+ if (m_str.empty())
+ return NULL;
+ return m_str.c_str();
+}
+
+void
+DNBError::LogThreadedIfError(const char *format, ...) const
+{
+ if (Fail())
+ {
+ char *arg_msg = NULL;
+ va_list args;
+ va_start (args, format);
+ ::vasprintf (&arg_msg, format, args);
+ va_end (args);
+
+ if (arg_msg != NULL)
+ {
+ const char *err_str = AsString();
+ if (err_str == NULL)
+ err_str = "???";
+ DNBLogThreaded ("error: %s err = %s (0x%8.8x)", arg_msg, err_str, m_err);
+ free (arg_msg);
+ }
+ }
+}
+
+void
+DNBError::LogThreaded(const char *format, ...) const
+{
+ char *arg_msg = NULL;
+ va_list args;
+ va_start (args, format);
+ ::vasprintf (&arg_msg, format, args);
+ va_end (args);
+
+ if (arg_msg != NULL)
+ {
+ if (Fail())
+ {
+ const char *err_str = AsString();
+ if (err_str == NULL)
+ err_str = "???";
+ DNBLogThreaded ("error: %s err = %s (0x%8.8x)", arg_msg, err_str, m_err);
+ }
+ else
+ {
+ DNBLogThreaded ("%s err = 0x%8.8x", arg_msg, m_err);
+ }
+ free (arg_msg);
+ }
+}