summaryrefslogtreecommitdiff
path: root/sal/osl/w32/diagnose.c
diff options
context:
space:
mode:
Diffstat (limited to 'sal/osl/w32/diagnose.c')
-rwxr-xr-xsal/osl/w32/diagnose.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/sal/osl/w32/diagnose.c b/sal/osl/w32/diagnose.c
new file mode 100755
index 000000000000..9c75e4502743
--- /dev/null
+++ b/sal/osl/w32/diagnose.c
@@ -0,0 +1,165 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#define NO_DEBUG_CRT
+
+#include <osl/diagnose.h>
+#include <osl/thread.h>
+
+#include "printtrace.h"
+
+#define NO_DEBUG_CRT
+
+static pfunc_osl_printDebugMessage _pPrintDebugMessage = NULL;
+static pfunc_osl_printDetailedDebugMessage _pPrintDetailedDebugMessage = NULL;
+
+pfunc_osl_printDebugMessage SAL_CALL osl_setDebugMessageFunc( pfunc_osl_printDebugMessage pNewFunc )
+{
+ pfunc_osl_printDebugMessage pOldFunc = _pPrintDebugMessage;
+ _pPrintDebugMessage = pNewFunc;
+
+ return pOldFunc;
+}
+
+pfunc_osl_printDetailedDebugMessage SAL_CALL osl_setDetailedDebugMessageFunc( pfunc_osl_printDetailedDebugMessage pNewFunc )
+{
+ pfunc_osl_printDetailedDebugMessage pOldFunc = _pPrintDetailedDebugMessage;
+ _pPrintDetailedDebugMessage = pNewFunc;
+ return pOldFunc;
+}
+
+/*
+ Trace output
+*/
+
+void SAL_CALL osl_breakDebug(void)
+{
+ DebugBreak();
+}
+
+void osl_trace(char const * pszFormat, ...) {
+ va_list args;
+ va_start(args, pszFormat);
+ if ( IsDebuggerPresent() )
+ {
+ sal_Char szMessage[512];
+ int written = _vsnprintf(
+ szMessage, sizeof(szMessage) - 2, pszFormat, args );
+ if ( written == -1 )
+ written = sizeof(szMessage) - 2;
+ szMessage[ written++ ] = '\n';
+ szMessage[ written ] = 0;
+ OutputDebugString( szMessage );
+ }
+ printTrace((unsigned long) _getpid(), pszFormat, args);
+ va_end(args);
+}
+
+sal_Bool SAL_CALL osl_assertFailedLine(const sal_Char* pszFileName, sal_Int32 nLine, const sal_Char* pszMessage)
+{
+#ifndef NO_DEBUG_CRT
+ return (_CrtDbgReport(_CRT_ASSERT, pszFileName, nLine, NULL, pszMessage));
+#else
+ HWND hWndParent;
+ UINT nFlags;
+ int nCode;
+
+ /* get app name or NULL if unknown (don't call assert) */
+ LPCSTR lpszAppName = "Error";
+ sal_Char szMessage[512];
+
+ /* format message into buffer */
+ szMessage[sizeof(szMessage)-1] = '\0'; /* zero terminate always */
+ _snprintf(szMessage, sizeof(szMessage)-1, "%s: File %hs, Line %d\n:%s\n",
+ lpszAppName, pszFileName, nLine, pszMessage);
+
+ OutputDebugString(szMessage);
+
+ if ( _pPrintDetailedDebugMessage )
+ _pPrintDetailedDebugMessage( pszFileName, nLine, pszMessage );
+ else if ( _pPrintDebugMessage )
+ _pPrintDebugMessage( szMessage );
+ else if ( !getenv( "DISABLE_SAL_DBGBOX" ) )
+ {
+ TCHAR szBoxMessage[1024];
+
+ /* active popup window for the current thread */
+ hWndParent = GetActiveWindow();
+ if (hWndParent != NULL)
+ hWndParent = GetLastActivePopup(hWndParent);
+
+ /* set message box flags */
+ nFlags = MB_TASKMODAL | MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON2 | MB_SETFOREGROUND;
+ if (hWndParent == NULL)
+ nFlags |= MB_SERVICE_NOTIFICATION;
+
+ /* display the assert */
+
+ szBoxMessage[sizeof(szBoxMessage)-1] = 0;
+ _snprintf(szBoxMessage, sizeof(szBoxMessage)-1, "%s\n( Yes=Abort / No=Ignore / Cancel=Debugger )",
+ szMessage);
+
+ nCode = MessageBox(hWndParent, szBoxMessage, "Assertion Failed!", nFlags);
+
+ if (nCode == IDYES)
+ FatalExit(-1);
+
+ if (nCode == IDNO)
+ return sal_False; /* ignore */
+
+ if (nCode == IDCANCEL)
+ return sal_True; /* will cause oslDebugBreak */
+ }
+#endif /* NO_DEBUG_CRT */
+ return sal_False; /* not shure, not care */
+}
+
+sal_Int32 SAL_CALL osl_reportError(sal_uInt32 nType, const sal_Char* pszMessage)
+{
+ UINT nFlags;
+ int nDisposition;
+
+ // active popup window for the current thread
+ HWND hWndParent = GetActiveWindow();
+ if (hWndParent != NULL)
+ hWndParent = GetLastActivePopup(hWndParent);
+
+ nType = nType; /* avoid warnings */
+
+ /* set message box flags */
+ nFlags = MB_TASKMODAL | MB_ICONERROR | MB_YESNOCANCEL | MB_DEFBUTTON2 | MB_SETFOREGROUND;
+ if (hWndParent == NULL)
+ nFlags |= MB_SERVICE_NOTIFICATION;
+
+ // display the assert
+ nDisposition = MessageBox(hWndParent, pszMessage, "Exception!", nFlags);
+
+ return nDisposition;
+}
+