diff --git a/CHANGES.md b/CHANGES.md index 4ea6799870..5fe462c080 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -41,6 +41,7 @@ Features * [#606](https://github.com/java-native-access/jna/pull/606): Added Kerne32Util method to facilitate checking that calls to LocalFree/GlobalFree are successful [@lgoldstein](https://github.com/lgoldstein). * [#612](https://github.com/java-native-access/jna/pull/612): Kernel32Util#freeLocal/GlobalMemory always throws Win32Exception if failed [@lgoldstein](https://github.com/lgoldstein). * [#608](https://github.com/java-native-access/jna/pull/608): Mavenize the build process - change parent and native pom artifactId/name to differentiate in IDE and build tools. [@bhamail](https://github.com/bhamail) +* [#613](https://github.com/java-native-access/jna/pull/613): Make Win32Exception extend LastErrorException [@lgoldstein](https://github.com/lgoldstein). Bug Fixes --------- diff --git a/contrib/platform/src/com/sun/jna/platform/win32/Win32Exception.java b/contrib/platform/src/com/sun/jna/platform/win32/Win32Exception.java index e87e44dfd0..e71b3148e3 100644 --- a/contrib/platform/src/com/sun/jna/platform/win32/Win32Exception.java +++ b/contrib/platform/src/com/sun/jna/platform/win32/Win32Exception.java @@ -1,54 +1,61 @@ /* Copyright (c) 2010 Daniel Doubrovkine, All Rights Reserved - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. - * + * * This library 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 for more details. + * Lesser General Public License for more details. */ package com.sun.jna.platform.win32; +import com.sun.jna.LastErrorException; import com.sun.jna.platform.win32.WinNT.HRESULT; /** * Win32 exception. * @author dblock[at]dblock[dot]org */ -public class Win32Exception extends RuntimeException { - +public class Win32Exception extends LastErrorException { + private static final long serialVersionUID = 1L; - + private HRESULT _hr; - + /** * Returns the error code of the error. - * @return - * Error code. + * @return HRESULT value */ public HRESULT getHR() { return _hr; } /** - * New Win32 exception from HRESULT. - * @param hr - * HRESULT + * New Win32 exception from an error code, usually obtained from {@code GetLastError.} + * @param code Error code. */ - public Win32Exception(HRESULT hr) { - super(Kernel32Util.formatMessage(hr)); - _hr = hr; + public Win32Exception(int code) { + this(code, W32Errors.HRESULT_FROM_WIN32(code)); } + /** - * New Win32 exception from an error code, usually obtained from GetLastError. - * @param code - * Error code. + * New Win32 exception from HRESULT. + * @param hr HRESULT */ - public Win32Exception(int code) { - this(W32Errors.HRESULT_FROM_WIN32(code)); + public Win32Exception(HRESULT hr) { + this(W32Errors.HRESULT_CODE(hr.intValue()), hr); + } + + protected Win32Exception(int code, HRESULT hr) { + this(code, hr, Kernel32Util.formatMessage(hr)); + } + + protected Win32Exception(int code, HRESULT hr, String msg) { + super(code, msg); + _hr = hr; } } diff --git a/contrib/platform/test/com/sun/jna/platform/win32/Win32ExceptionTest.java b/contrib/platform/test/com/sun/jna/platform/win32/Win32ExceptionTest.java index 9265162dff..a0daf2170e 100644 --- a/contrib/platform/test/com/sun/jna/platform/win32/Win32ExceptionTest.java +++ b/contrib/platform/test/com/sun/jna/platform/win32/Win32ExceptionTest.java @@ -1,17 +1,19 @@ /* Copyright (c) 2010 Daniel Doubrovkine, All Rights Reserved - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. - * + * * This library 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 for more details. + * Lesser General Public License for more details. */ package com.sun.jna.platform.win32; +import com.sun.jna.LastErrorException; + import junit.framework.TestCase; /** @@ -23,21 +25,25 @@ public static void main(String[] args) { junit.textui.TestRunner.run(Win32ExceptionTest.class); } - public void testFormatMessageFromLastErrorCode() { - try { - throw new Win32Exception(W32Errors.ERROR_SHARING_PAUSED); - } catch (Win32Exception e) { - assertEquals("The remote server has been paused or is in the process of being started.", - e.getMessage()); - } - } + public void testFormatMessageFromLastErrorCode() { + try { + throw new Win32Exception(W32Errors.ERROR_SHARING_PAUSED); + } catch (Win32Exception e) { + assertLastErrorValue(e, W32Errors.ERROR_SHARING_PAUSED, + "The remote server has been paused or is in the process of being started."); + } + } - public void testFormatMessageFromHR() { - try { - throw new Win32Exception(W32Errors.S_OK); - } catch (Win32Exception e) { - assertEquals("The operation completed successfully.", - e.getMessage()); - } - } + public void testFormatMessageFromHR() { + try { + throw new Win32Exception(W32Errors.S_OK); + } catch (Win32Exception e) { + assertLastErrorValue(e, W32Errors.ERROR_SUCCESS, "The operation completed successfully."); + } + } + + private void assertLastErrorValue(LastErrorException e, int code, String msg) { + assertEquals("Mismatched error code", code, e.getErrorCode()); + assertEquals("Mismatched error message", msg, e.getMessage()); + } } diff --git a/src/com/sun/jna/LastErrorException.java b/src/com/sun/jna/LastErrorException.java index cb9bd64e85..ac34a192b5 100644 --- a/src/com/sun/jna/LastErrorException.java +++ b/src/com/sun/jna/LastErrorException.java @@ -31,12 +31,18 @@ private static String formatMessage(int code) { private static String parseMessage(String m) { try { return formatMessage(Integer.parseInt(m)); - } - catch(NumberFormatException e) { + } catch(NumberFormatException e) { return m; } } + /** + * @return The reported error code + */ + public int getErrorCode() { + return errorCode; + } + public LastErrorException(String msg) { super(parseMessage(msg.trim())); try { @@ -44,23 +50,17 @@ public LastErrorException(String msg) { msg = msg.substring(1, msg.indexOf("]")); } this.errorCode = Integer.parseInt(msg); - } - catch(NumberFormatException e) { + } catch(NumberFormatException e) { this.errorCode = -1; } } - /** - * Returns the error code of the error. - * @return - * Error code. - */ - public int getErrorCode() { - return errorCode; + public LastErrorException(int code) { + this(code, formatMessage(code)); } - public LastErrorException(int code) { - super(formatMessage(code)); + protected LastErrorException(int code, String msg) { + super(msg); this.errorCode = code; } } \ No newline at end of file