diff options
author | Matúš Kukan <matus.kukan@gmail.com> | 2013-04-16 10:10:57 +0200 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2013-04-16 18:25:18 +0000 |
commit | be421269f95446307d1168e17e1fe9ee7d9a0a66 (patch) | |
tree | 491fa90929828589d390e994b3e9f841672d22ea /include/wntgcci | |
parent | baffab9a4ffca9a4940a3310937d6e858e66cc1f (diff) |
move headers from solenv/inc/ to include/
Change-Id: Ieb6cba645b3535f7d683d2aefa5599d04d9994f3
Reviewed-on: https://gerrit.libreoffice.org/3403
Reviewed-by: David Tardon <dtardon@redhat.com>
Tested-by: David Tardon <dtardon@redhat.com>
Diffstat (limited to 'include/wntgcci')
-rw-r--r-- | include/wntgcci/jni_md.h | 42 | ||||
-rw-r--r-- | include/wntgcci/sehandler.hxx | 128 |
2 files changed, 170 insertions, 0 deletions
diff --git a/include/wntgcci/jni_md.h b/include/wntgcci/jni_md.h new file mode 100644 index 000000000000..b7aab253b350 --- /dev/null +++ b/include/wntgcci/jni_md.h @@ -0,0 +1,42 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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. + */ + +/* Fake jni_md.h for use when cross-compiling to Windows */ + +#ifndef JNI_MD_H_INCLUDED +#define JNI_MD_H_INCLUDED + +#define JNIEXPORT __declspec (dllexport) +#define JNIIMPORT __declspec (dllimport) +#define JNICALL __stdcall + +typedef long jint; +typedef __int64 jlong; +typedef char jbyte; + +#endif /* JNI_MD_H_INCLUDED */ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/wntgcci/sehandler.hxx b/include/wntgcci/sehandler.hxx new file mode 100644 index 000000000000..2fabe486a452 --- /dev/null +++ b/include/wntgcci/sehandler.hxx @@ -0,0 +1,128 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ + +// Provenance of this code unclear. From crosswin32-dtrans-mingw.diff, +// but from where it got there, I don't know. + + +#ifndef _SEHANDLER_HXX +#define _SEHANDLER_HXX + +#ifndef __MINGW32__ +#error This file should be included only in a MinGW compilation +#endif + +#include <windows.h> +#include <setjmp.h> + +#ifndef EH_UNWINDING +// See _EH_UNWINDING in MSVS9/VC/crt/src/except.inc +#define EH_UNWINDING 2 +#endif + +namespace { +class __SEHandler +{ +public: + __SEHandler() {} + ~__SEHandler() {} + typedef int (*PF)(void *, LPEXCEPTION_POINTERS); + typedef void (*PH)(void *, LPEXCEPTION_POINTERS); + typedef void (*PN)(void *); + void Set(jmp_buf jb, void *pdata=NULL, PF pfilter=NULL, PH phandlerbody=NULL, PN pfinal=NULL) + { + __builtin_memcpy(m_jmpbuf, jb, sizeof(jmp_buf)); + m_pData=pdata; + switch (reinterpret_cast<int>(pfilter)) + { + default: + m_filter=pfilter; + break; + case EXCEPTION_CONTINUE_EXECUTION: + m_filter=DefaultFilterContinueExecution; + break; + case EXCEPTION_EXECUTE_HANDLER: + m_filter=DefaultFilterExecuteHandler; + break; + case EXCEPTION_CONTINUE_SEARCH: + m_filter=DefaultFilterContinueSearch; + break; + } + if (phandlerbody) + m_handlerbody=phandlerbody; + else + m_handlerbody=DefaultHandler; + if (pfinal) + m_final=pfinal; + else + m_final=DefaultFinal; + m_ER.pHandlerClass = this; + m_ER.hp = handler; + asm("movl %%fs:0, %%eax\n\t" + "movl %%eax, %0": : "m" (m_ER.prev): "%eax" ); + asm("movl %0, %%eax\n\t" + "movl %%eax, %%fs:0": : "r" (&m_ER): "%eax" ); + } + void Reset() + { + m_final(m_pData); + asm("movl %0, %%eax \n\t" + "movl %%eax, %%fs:0" + : : "m" (m_ER.prev): "%eax"); + } +private: + __SEHandler(const __SEHandler&); + __SEHandler& operator=(const __SEHandler&); + struct _ER { + _ER* prev; + PEXCEPTION_HANDLER hp; + __SEHandler *pHandlerClass; + }; + static EXCEPTION_DISPOSITION handler(struct _EXCEPTION_RECORD *pExceptionRecord, + void * EstablisherFrame, + struct _CONTEXT *ContextRecord, + void * /*DispatcherContext*/) + { + __SEHandler* pThis = reinterpret_cast< _ER * >(EstablisherFrame)->pHandlerClass; + if (pExceptionRecord->ExceptionFlags & EH_UNWINDING) + { + pThis->m_final(pThis->m_pData); + return ExceptionContinueSearch; + } + EXCEPTION_POINTERS ep={pExceptionRecord, ContextRecord}; + switch (pThis->m_filter(pThis->m_pData, &ep)) + { + case EXCEPTION_EXECUTE_HANDLER: + RtlUnwind(EstablisherFrame, &&__set_label, pExceptionRecord, 0); + __set_label: + pThis->m_handlerbody(pThis->m_pData, &ep); + ContextRecord->Ebp = pThis->m_jmpbuf[0]; + ContextRecord->Eip = pThis->m_jmpbuf[1]; + ContextRecord->Esp = pThis->m_jmpbuf[2]; + return ExceptionContinueExecution; + case EXCEPTION_CONTINUE_SEARCH: + return ExceptionContinueSearch; + case EXCEPTION_CONTINUE_EXECUTION: + return ExceptionContinueExecution; + } + return ExceptionContinueExecution; + } + static int DefaultFilterContinueSearch(void *, LPEXCEPTION_POINTERS) { return EXCEPTION_CONTINUE_SEARCH; } + static int DefaultFilterContinueExecution(void *, LPEXCEPTION_POINTERS) { return EXCEPTION_CONTINUE_EXECUTION; } + static int DefaultFilterExecuteHandler(void *, LPEXCEPTION_POINTERS) { return EXCEPTION_EXECUTE_HANDLER; } + static void DefaultHandler(void *, LPEXCEPTION_POINTERS) {} + static void DefaultFinal(void *) {} + typedef int (*handler_p)(struct _EXCEPTION_RECORD *ExceptionRecord, + void * EstablisherFrame, + struct _CONTEXT *ContextRecord, + void * DispatcherContext); + _ER m_ER; + void *m_pData; + PN m_final; + PH m_handlerbody; + PF m_filter; + jmp_buf m_jmpbuf; +}; + +} // namespace { + +#endif // _SEHANDLER_HXX |