Skip to content

Commit

Permalink
Merge pull request #613 from lgoldstein/win32-as-last-error
Browse files Browse the repository at this point in the history
Make Win32Exception extend LastErrorException
  • Loading branch information
twall committed Mar 8, 2016
2 parents f9b6117 + 21c4f33 commit 6a7d6c2
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 52 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
---------
Expand Down
47 changes: 27 additions & 20 deletions contrib/platform/src/com/sun/jna/platform/win32/Win32Exception.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;

/**
Expand All @@ -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());
}
}
26 changes: 13 additions & 13 deletions src/com/sun/jna/LastErrorException.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,36 +31,36 @@ 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 {
if (msg.startsWith("[")) {
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;
}
}

0 comments on commit 6a7d6c2

Please sign in to comment.