Skip to content

Commit

Permalink
Make Win32Exception extend LastErrorException
Browse files Browse the repository at this point in the history
  • Loading branch information
Lyor Goldstein committed Mar 7, 2016
1 parent f9b6117 commit 7a571ad
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 40 deletions.
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 @@ -27,17 +29,21 @@ 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());
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());
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 7a571ad

Please sign in to comment.