Browse Source
* commit '9f7b4b9fb5f5aced05af953a45f74a8cdd1e871e': REPORT-13005 sub标签设置color属性,实际导出没有效果 REPORT-11969 注册增强 1. 修改 el 后缀, 通用 win/linux REPORT-11969 注册增强 删除无用代码 删除无用代码 REPORT-11624 Excel和Word导出的html解析(third部分) CORE-135 插件禁用再启用后Jackson实例化的java对象仍然用的插件卸载前的classLoader fix fix fix fix MOBILE-17909&MOBILE-17908 10.0微信》定时调度有微信任务时卸载微信插件,报错 无JIRA任务,third打包分支错误. 无 REPORT-11624 Excel和Word导出的html解析支持final/10.0.3
neil
6 years ago
41 changed files with 5926 additions and 3085 deletions
@ -0,0 +1,200 @@ |
|||||||
|
package com.fr.third.com.lowagie.text.html; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author kerry |
||||||
|
* @date 2018/5/11 |
||||||
|
*/ |
||||||
|
public class CSS { |
||||||
|
public final class Value { |
||||||
|
private Value(){}; |
||||||
|
public static final String THIN = "thin"; |
||||||
|
public static final String MEDIUM = "medium"; |
||||||
|
public static final String THICK = "thick"; |
||||||
|
public static final String NONE = "none"; |
||||||
|
public static final String HIDDEN = "hidden"; |
||||||
|
public static final String DOTTED = "dotted"; |
||||||
|
public static final String DASHED = "dashed"; |
||||||
|
public static final String SOLID = "solid"; |
||||||
|
public static final String DOUBLE = "double"; |
||||||
|
public static final String GROOVE = "groove"; |
||||||
|
public static final String RIDGE = "ridge"; |
||||||
|
public static final String INSET = "inset"; |
||||||
|
public static final String OUTSET = "outset"; |
||||||
|
public static final String LEFT = "left"; |
||||||
|
public static final String CENTER = "center"; |
||||||
|
public static final String JUSTIFY = "justify"; |
||||||
|
public static final String BOTTOM = "bottom"; |
||||||
|
public static final String TOP = "top"; |
||||||
|
public static final String RIGHT = "right"; |
||||||
|
public static final String REPEAT = "repeat"; |
||||||
|
public static final String NO_REPEAT = "no-repeat"; |
||||||
|
public static final String REPEAT_X = "repeat-x"; |
||||||
|
public static final String REPEAT_Y = "repeat-y"; |
||||||
|
public static final String FIXED = "fixed"; |
||||||
|
public static final String SCROLL = "scroll"; |
||||||
|
public static final String DISC = "disc"; |
||||||
|
public static final String SQUARE = "square"; |
||||||
|
public static final String CIRCLE = "circle"; |
||||||
|
public static final String DECIMAL = "decimal"; |
||||||
|
public static final String LOWER_ROMAN = "lower-roman"; |
||||||
|
public static final String UPPER_ROMAN = "upper-roman"; |
||||||
|
public static final String LOWER_GREEK = "lower-greek"; |
||||||
|
public static final String UPPER_GREEK = "upper-greek"; |
||||||
|
public static final String LOWER_ALPHA = "lower-alpha"; |
||||||
|
public static final String UPPER_ALPHA = "upper-alpha"; |
||||||
|
public static final String LOWER_LATIN = "lower-latin"; |
||||||
|
public static final String UPPER_LATIN = "upper-latin"; |
||||||
|
public static final String INSIDE = "inside"; |
||||||
|
public static final String OUTSIDE = "outside"; |
||||||
|
public static final String INHERIT = "inherit"; |
||||||
|
public static final String UNDERLINE = "underline"; |
||||||
|
public static final String BOLD = "bold"; |
||||||
|
public static final String ITALIC = "italic"; |
||||||
|
public static final String OBLIQUE = "oblique"; |
||||||
|
public static final String SUPER = "super"; |
||||||
|
public static final String SUB = "sub"; |
||||||
|
public static final String TEXT_TOP = "text-top"; |
||||||
|
public static final String TEXT_BOTTOM = "text-bottom"; |
||||||
|
public static final String LINE_THROUGH = "line-through"; |
||||||
|
public static final String RELATIVE = "relative"; |
||||||
|
public static final String HIDE = "hide"; |
||||||
|
public static final String XX_SMALL = "xx-small"; |
||||||
|
public static final String X_SMALL = "x-small"; |
||||||
|
public static final String SMALL = "small"; |
||||||
|
public static final String LARGE = "large"; |
||||||
|
public static final String X_LARGE = "x-large"; |
||||||
|
public static final String XX_LARGE = "xx-large"; |
||||||
|
public static final String SMALLER = "smaller"; |
||||||
|
public static final String LARGER = "larger"; |
||||||
|
public static final String PX = "px"; |
||||||
|
public static final String IN = "in"; |
||||||
|
public static final String CM = "cm"; |
||||||
|
public static final String MM = "mm"; |
||||||
|
public static final String PT = "pt"; |
||||||
|
public static final String PC = "pc"; |
||||||
|
public static final String PERCENTAGE = "%"; |
||||||
|
public static final String EM = "em"; |
||||||
|
public static final String EX = "ex"; |
||||||
|
public static final String ALWAYS = "always"; |
||||||
|
public static final String AVOID = "avoid"; |
||||||
|
public static final String ABSOLUTE = "absolute"; |
||||||
|
public static final String AUTO = "auto"; |
||||||
|
public static final String INLINE = "inline"; |
||||||
|
public static final String BLOCK = "block"; |
||||||
|
public static final String SEPARATE = "separate"; |
||||||
|
public static final String COLLAPSE = "collapse"; |
||||||
|
public static final String RTL = "rtl"; |
||||||
|
public static final String LTR = "ltr"; |
||||||
|
public static final String INLINE_BLOCK = "inline-block"; |
||||||
|
public static final String INLINE_TABLE = "inline-table"; |
||||||
|
public static final String LIST_ITEM = "list-item"; |
||||||
|
public static final String RUN_IN = "run-in"; |
||||||
|
public static final String TABLE = "table"; |
||||||
|
public static final String TABLE_CAPTION = "table-caption"; |
||||||
|
public static final String TABLE_CELL = "table-cell"; |
||||||
|
public static final String TABLE_COLUMN_GROUP = "table-column-group"; |
||||||
|
public static final String TABLE_COLUMN = "table-column"; |
||||||
|
public static final String TABLE_FOOTER_GROUP = "table-footer-group"; |
||||||
|
public static final String TABLE_HEADER_GROUP = "table-header-group"; |
||||||
|
public static final String TABLE_ROW = "table-row"; |
||||||
|
public static final String TABLE_ROW_GROUP = "table-row-group"; |
||||||
|
} |
||||||
|
|
||||||
|
public final class Property { |
||||||
|
|
||||||
|
private Property() {}; |
||||||
|
public static final String BACKGROUND = "background"; |
||||||
|
public static final String BACKGROUND_IMAGE = "background-image"; |
||||||
|
public static final String BACKGROUND_REPEAT = "background-repeat"; |
||||||
|
public static final String BACKGROUND_ATTACHMENT = "background-attachment"; |
||||||
|
public static final String BACKGROUND_POSITION = "background-position"; |
||||||
|
public static final String BACKGROUND_COLOR = "background-color"; |
||||||
|
public static final String BACKGROUND_SIZE = "background-size"; |
||||||
|
public static final String LIST_STYLE = "list-style"; |
||||||
|
public static final String LIST_STYLE_TYPE = "list-style-type"; |
||||||
|
public static final String LIST_STYLE_POSITION = "list-style-position"; |
||||||
|
public static final String LIST_STYLE_IMAGE = "list-style-image"; |
||||||
|
public static final String MARGIN = "margin"; |
||||||
|
public static final String TOP = "top"; |
||||||
|
public static final String MARGIN_LEFT = "margin-left"; |
||||||
|
public static final String MARGIN_RIGHT = "margin-right"; |
||||||
|
public static final String MARGIN_TOP = "margin-top"; |
||||||
|
public static final String MARGIN_BOTTOM = "margin-bottom"; |
||||||
|
public static final String BORDER = "border"; |
||||||
|
public static final String BORDER_LEFT = "border-left"; |
||||||
|
public static final String BORDER_TOP = "border-top"; |
||||||
|
public static final String BORDER_RIGHT = "border-right"; |
||||||
|
public static final String BORDER_BOTTOM = "border-bottom"; |
||||||
|
public static final String BORDER_WIDTH = "border-width"; |
||||||
|
public static final String BORDER_STYLE = "border-style"; |
||||||
|
public static final String BORDER_COLOR = "border-color"; |
||||||
|
public static final String BORDER_COLLAPSE = "border-collapse"; |
||||||
|
public static final String BORDER_SPACING = "border-spacing"; |
||||||
|
public static final String BORDER_TOP_WIDTH = "border-top-width"; |
||||||
|
public static final String BORDER_BOTTOM_WIDTH = "border-bottom-width"; |
||||||
|
public static final String BORDER_LEFT_WIDTH = "border-left-width"; |
||||||
|
public static final String BORDER_RIGHT_WIDTH = "border-right-width"; |
||||||
|
public static final String BORDER_TOP_COLOR = "border-top-color"; |
||||||
|
public static final String BORDER_BOTTOM_COLOR = "border-bottom-color"; |
||||||
|
public static final String BORDER_LEFT_COLOR = "border-left-color"; |
||||||
|
public static final String BORDER_RIGHT_COLOR = "border-right-color"; |
||||||
|
public static final String BORDER_TOP_STYLE = "border-top-style"; |
||||||
|
public static final String BORDER_BOTTOM_STYLE = "border-bottom-style"; |
||||||
|
public static final String BORDER_LEFT_STYLE = "border-left-style"; |
||||||
|
public static final String BORDER_RIGHT_STYLE = "border-right-style"; |
||||||
|
public static final String PADDING = "padding"; |
||||||
|
public static final String PADDING_TOP = "padding-top"; |
||||||
|
public static final String PADDING_BOTTOM = "padding-bottom"; |
||||||
|
public static final String PADDING_LEFT = "padding-left"; |
||||||
|
public static final String PADDING_RIGHT = "padding-right"; |
||||||
|
public static final String FONT = "font"; |
||||||
|
public static final String FONT_WEIGHT = "font-weight"; |
||||||
|
public static final String FONT_SIZE = "font-size"; |
||||||
|
public static final String FONT_STYLE = "font-style"; |
||||||
|
public static final String FONT_FAMILY = "font-family"; |
||||||
|
public static final String TEXT_DECORATION = "text-decoration"; |
||||||
|
public static final String COLOR = "color"; |
||||||
|
public static final String TAB_INTERVAL = "tab-interval"; |
||||||
|
public static final String XFA_TAB_COUNT = "xfa-tab-count"; |
||||||
|
public static final String XFA_FONT_HORIZONTAL_SCALE = "xfa-font-horizontal-scale"; |
||||||
|
public static final String XFA_FONT_VERTICAL_SCALE = "xfa-font-vertical-scale"; |
||||||
|
public static final String BEFORE = "before"; |
||||||
|
public static final String AFTER = "after"; |
||||||
|
public static final String HEIGHT = "height"; |
||||||
|
public static final String WIDTH = "width"; |
||||||
|
public static final String LETTER_SPACING = "letter-spacing"; |
||||||
|
public static final String VERTICAL_ALIGN = "vertical-align"; |
||||||
|
public static final String LINE_HEIGHT = "line-height"; |
||||||
|
public static final String TEXT_ALIGN = "text-align"; |
||||||
|
public static final String TEXT_VALIGN = "text-valign"; |
||||||
|
public static final String TEXT_INDENT = "text-indent"; |
||||||
|
public static final String POSITION = "position"; |
||||||
|
public static final String EMPTY_CELLS = "empty-cells"; |
||||||
|
public static final String CELLPADDING = "cellpadding"; |
||||||
|
//deprecated
|
||||||
|
public static final String CELLPADDING_LEFT = "cellpadding-left"; |
||||||
|
public static final String CELLPADDING_TOP = "cellpadding-top"; |
||||||
|
public static final String CELLPADDING_RIGHT = "cellpadding-right"; |
||||||
|
public static final String CELLPADDING_BOTTOM = "cellpadding-bottom"; |
||||||
|
|
||||||
|
public static final String CAPTION_SIDE = "caption-side"; |
||||||
|
public static final String TAB_STOPS = "tab-stops"; |
||||||
|
public static final String XFA_TAB_STOPS = "xfa-tab-stops"; |
||||||
|
public static final String PAGE_BREAK_BEFORE = "page-break-before"; |
||||||
|
public static final String PAGE_BREAK_INSIDE = "page-break-inside"; |
||||||
|
public static final String PAGE_BREAK_AFTER = "page-break-after"; |
||||||
|
public static final String REPEAT_HEADER = "repeat-header"; |
||||||
|
public static final String REPEAT_FOOTER = "repeat-footer"; |
||||||
|
public static final String LEFT = "left"; |
||||||
|
public static final String DISPLAY = "display"; |
||||||
|
public static final String MIN_WIDTH = "min-width"; |
||||||
|
public static final String MAX_WIDTH = "max-width"; |
||||||
|
public static final String MIN_HEIGHT = "min-height"; |
||||||
|
public static final String MAX_HEIGHT = "max-height"; |
||||||
|
public static final String RIGHT = "right"; |
||||||
|
public static final String BOTTOM = "bottom"; |
||||||
|
public static final String FLOAT = "float"; |
||||||
|
public static final String DIRECTION = "direction"; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,105 @@ |
|||||||
|
package com.fr.third.com.lowagie.text.html; |
||||||
|
|
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Set; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author kerry |
||||||
|
* @date 2018/4/9 |
||||||
|
*/ |
||||||
|
public class CSSUtils { |
||||||
|
|
||||||
|
|
||||||
|
private static final Set<String> backgroundPositions = new HashSet<String>( |
||||||
|
Arrays.asList(new String[] { CSS.Value.LEFT, CSS.Value.CENTER, CSS.Value.BOTTOM, CSS.Value.TOP, CSS.Value.RIGHT })); |
||||||
|
|
||||||
|
public static Map<String, String> processBackground(final String background) { |
||||||
|
Map<String, String> rules = new HashMap<String, String>(); |
||||||
|
String[] styles = splitComplexCssStyle(background); |
||||||
|
for(String style : styles) { |
||||||
|
if (style.contains("url(")) { |
||||||
|
rules.put(CSS.Property.BACKGROUND_IMAGE, style); |
||||||
|
} else if (style.equalsIgnoreCase(CSS.Value.REPEAT) |
||||||
|
|| style.equalsIgnoreCase(CSS.Value.NO_REPEAT) |
||||||
|
|| style.equalsIgnoreCase(CSS.Value.REPEAT_X) |
||||||
|
|| style.equalsIgnoreCase(CSS.Value.REPEAT_Y)) { |
||||||
|
rules.put(CSS.Property.BACKGROUND_REPEAT, style); |
||||||
|
} else if (style.equalsIgnoreCase(CSS.Value.FIXED) || style.equalsIgnoreCase(CSS.Value.SCROLL)) { |
||||||
|
rules.put(CSS.Property.BACKGROUND_ATTACHMENT, style); |
||||||
|
} else if (backgroundPositions.contains(style)) { |
||||||
|
if(rules.get(CSS.Property.BACKGROUND_POSITION) == null) { |
||||||
|
rules.put(CSS.Property.BACKGROUND_POSITION, style); |
||||||
|
} else { |
||||||
|
style = style.concat(" "+rules.get(CSS.Property.BACKGROUND_POSITION)); |
||||||
|
rules.put(CSS.Property.BACKGROUND_POSITION, style); |
||||||
|
} |
||||||
|
} else if (isNumericValue(style) || isMetricValue(style) || isRelativeValue(style)) { |
||||||
|
if(rules.get(CSS.Property.BACKGROUND_POSITION) == null) { |
||||||
|
rules.put(CSS.Property.BACKGROUND_POSITION, style); |
||||||
|
} else { |
||||||
|
style = style.concat(" "+rules.get(CSS.Property.BACKGROUND_POSITION)); |
||||||
|
rules.put(CSS.Property.BACKGROUND_POSITION, style); |
||||||
|
} |
||||||
|
} else if(style.contains("rgb(") || style.contains("rgba(") || style.contains("#") || WebColors.NAMES.containsKey(style.toLowerCase())) { |
||||||
|
rules.put(CSS.Property.BACKGROUND_COLOR, style); |
||||||
|
} |
||||||
|
} |
||||||
|
return rules; |
||||||
|
} |
||||||
|
public static String[] splitComplexCssStyle(String s) { |
||||||
|
s = s.replaceAll("\\s*,\\s*", ",") ; |
||||||
|
return s.split("\\s"); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static boolean isMetricValue(final String value) { |
||||||
|
return value.contains(CSS.Value.PX) || value.contains(CSS.Value.IN) || value.contains(CSS.Value.CM) |
||||||
|
|| value.contains(CSS.Value.MM) || value.contains(CSS.Value.PC) || value.contains(CSS.Value.PT); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isRelativeValue(final String value) { |
||||||
|
return value.contains(CSS.Value.PERCENTAGE) || value.contains(CSS.Value.EM) || value.contains(CSS.Value.EX); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isNumericValue(final String value) { |
||||||
|
return value.matches("^-?\\d\\d*\\.\\d*$") || value.matches("^-?\\d\\d*$") || value.matches("^-?\\.\\d\\d*$"); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static String extractUrl(final String url) { |
||||||
|
String str = null; |
||||||
|
if (url.startsWith("url")) { |
||||||
|
String urlString = url.substring(3).trim().replace("(", "").replace(")", "").trim(); |
||||||
|
if (urlString.startsWith("'") && urlString.endsWith("'")) { |
||||||
|
str = urlString.substring(urlString.indexOf("'")+1, urlString.lastIndexOf("'")); |
||||||
|
} else if ( urlString.startsWith("\"") && urlString.endsWith("\"") ) { |
||||||
|
str = urlString.substring(urlString.indexOf('"')+1, urlString.lastIndexOf('"')); |
||||||
|
} else { |
||||||
|
str = urlString; |
||||||
|
} |
||||||
|
} else { |
||||||
|
str = url; |
||||||
|
} |
||||||
|
return str; |
||||||
|
} |
||||||
|
|
||||||
|
public static Float parseFloat(String str){ |
||||||
|
float result = 0.0f; |
||||||
|
try { |
||||||
|
if(str.endsWith("px") || str.endsWith("pt")){ |
||||||
|
result = Float.parseFloat(str.substring(0, str.length() - 2)); |
||||||
|
}else{ |
||||||
|
result = Float.parseFloat(str); |
||||||
|
} |
||||||
|
}catch (NumberFormatException e){ |
||||||
|
|
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,55 @@ |
|||||||
|
package com.fr.third.com.lowagie.text.html; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author kerry |
||||||
|
* @date 2018/5/9 |
||||||
|
*/ |
||||||
|
public class IndentAttribute { |
||||||
|
private float top = 0.0f; |
||||||
|
private float bottom = 0.0f; |
||||||
|
private float left = 0.0f; |
||||||
|
private float right = 0.0f; |
||||||
|
|
||||||
|
public float getTop() { |
||||||
|
return top; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTop(float top) { |
||||||
|
this.top = top; |
||||||
|
} |
||||||
|
|
||||||
|
public float getBottom() { |
||||||
|
return bottom; |
||||||
|
} |
||||||
|
|
||||||
|
public void setBottom(float bottom) { |
||||||
|
this.bottom = bottom; |
||||||
|
} |
||||||
|
|
||||||
|
public float getLeft() { |
||||||
|
return left; |
||||||
|
} |
||||||
|
|
||||||
|
public void setLeft(float left) { |
||||||
|
this.left = left; |
||||||
|
} |
||||||
|
|
||||||
|
public float getRight() { |
||||||
|
return right; |
||||||
|
} |
||||||
|
|
||||||
|
public void setRight(float right) { |
||||||
|
this.right = right; |
||||||
|
} |
||||||
|
|
||||||
|
public IndentAttribute(float top, float left, float bottom, float right){ |
||||||
|
this.top = top; |
||||||
|
this.left = left; |
||||||
|
this.bottom = bottom; |
||||||
|
this.right = right; |
||||||
|
} |
||||||
|
|
||||||
|
public IndentAttribute(){ |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,84 @@ |
|||||||
|
package com.fr.third.com.lowagie.text.html; |
||||||
|
|
||||||
|
import com.fr.third.com.lowagie.text.html.CSS; |
||||||
|
import com.fr.third.com.lowagie.text.html.IndentAttribute; |
||||||
|
import com.fr.third.com.lowagie.text.html.Markup; |
||||||
|
|
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author kerry |
||||||
|
* @date 2018/5/14 |
||||||
|
*/ |
||||||
|
public class ParseIndentAttrUtils { |
||||||
|
public static IndentAttribute parseSpace(String indent){ |
||||||
|
String[] a = indent.split(" "); |
||||||
|
if(a.length == 0){ |
||||||
|
return new IndentAttribute(); |
||||||
|
} |
||||||
|
float indentTop = Markup.parseLength(a[0]); |
||||||
|
if(a.length == 1){ |
||||||
|
return new IndentAttribute(indentTop, indentTop, indentTop, indentTop); |
||||||
|
} |
||||||
|
float indentLeft = Markup.parseLength(a[1]); |
||||||
|
if(a.length == 2){ |
||||||
|
return new IndentAttribute(indentTop, indentLeft, indentTop, indentLeft); |
||||||
|
} |
||||||
|
float indentBottom = Markup.parseLength(a[2]); |
||||||
|
if(a.length == 3){ |
||||||
|
return new IndentAttribute(indentTop, indentLeft, indentBottom, indentLeft); |
||||||
|
} |
||||||
|
float indentRight = Markup.parseLength(a[3]); |
||||||
|
return new IndentAttribute(indentTop, indentLeft, indentBottom, indentRight); |
||||||
|
} |
||||||
|
|
||||||
|
public static IndentAttribute parsePaddingAttribute(Map map){ |
||||||
|
if (map == null){ |
||||||
|
return new IndentAttribute(); |
||||||
|
} |
||||||
|
IndentAttribute indentAttribute = new IndentAttribute(); |
||||||
|
Iterator iter = map.entrySet().iterator(); |
||||||
|
while (iter.hasNext()) { |
||||||
|
Map.Entry entry = (Map.Entry) iter.next(); |
||||||
|
String key = (String) entry.getKey(); |
||||||
|
if (CSS.Property.PADDING_LEFT.equals(key)) { |
||||||
|
indentAttribute.setLeft(Markup.parseLength((String) entry.getValue())); |
||||||
|
} else if (CSS.Property.PADDING_RIGHT.equals(key)) { |
||||||
|
indentAttribute.setRight(Markup.parseLength((String) entry.getValue())); |
||||||
|
} else if (CSS.Property.PADDING_TOP.equals(key)) { |
||||||
|
indentAttribute.setTop(Markup.parseLength((String) entry.getValue())); |
||||||
|
} else if (CSS.Property.PADDING_BOTTOM.equals(key)) { |
||||||
|
indentAttribute.setBottom(Markup.parseLength((String) entry.getValue())); |
||||||
|
} |
||||||
|
} |
||||||
|
return indentAttribute; |
||||||
|
} |
||||||
|
|
||||||
|
public static IndentAttribute parseMarginAttribute(Map map){ |
||||||
|
IndentAttribute indentAttribute = new IndentAttribute(); |
||||||
|
Iterator iter = map.entrySet().iterator(); |
||||||
|
while (iter.hasNext()) { |
||||||
|
Map.Entry entry = (Map.Entry) iter.next(); |
||||||
|
String key = (String) entry.getKey(); |
||||||
|
float val = Markup.parseLength((String) entry.getValue()); |
||||||
|
if (CSS.Property.MARGIN_LEFT.equals(key)) { |
||||||
|
indentAttribute.setLeft(val); |
||||||
|
} else if (CSS.Property.MARGIN_RIGHT.equals(key)) { |
||||||
|
indentAttribute.setRight(val); |
||||||
|
} else if (CSS.Property.MARGIN_TOP.equals(key)) { |
||||||
|
indentAttribute.setTop(val); |
||||||
|
} else if (CSS.Property.MARGIN_BOTTOM.equals(key)) { |
||||||
|
indentAttribute.setBottom(val); |
||||||
|
} |
||||||
|
} |
||||||
|
return indentAttribute; |
||||||
|
} |
||||||
|
|
||||||
|
public static void createIndent(StringBuffer stringBuffer, String attr, IndentAttribute indentAttribute){ |
||||||
|
stringBuffer.append(attr).append("-").append("left").append(":").append(indentAttribute.getLeft()).append("px;") |
||||||
|
.append(attr).append("-").append("right").append(":").append(indentAttribute.getRight()).append("px;") |
||||||
|
.append(attr).append("-").append("top").append(":").append(indentAttribute.getTop()).append("px;") |
||||||
|
.append(attr).append("-").append("bottom").append(":").append(indentAttribute.getBottom()).append("px;"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
package com.fr.third.com.lowagie.text.html.simpleparser; |
||||||
|
|
||||||
|
import com.fr.third.com.lowagie.text.html.HtmlTags; |
||||||
|
import com.fr.third.com.lowagie.text.html.Markup; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author kerry |
||||||
|
* @date 2018/5/2 |
||||||
|
*/ |
||||||
|
public class HtmlConstants { |
||||||
|
//块级元素集合
|
||||||
|
public static final List<String> BLOCK_ELEMENTS = new ArrayList<String>(); |
||||||
|
//行内元素集合
|
||||||
|
public static final List<String> INLINE_ELEMENTS = new ArrayList<String>(); |
||||||
|
//支持解析的属性
|
||||||
|
public static final List<String> PADDING = new ArrayList<String>(); |
||||||
|
public static final List<String> MARGIN = new ArrayList<String>(); |
||||||
|
static { |
||||||
|
BLOCK_ELEMENTS.add(HtmlTags.DIV); |
||||||
|
BLOCK_ELEMENTS.add(HtmlTags.UNORDEREDLIST); |
||||||
|
BLOCK_ELEMENTS.add(HtmlTags.PARAGRAPH); |
||||||
|
BLOCK_ELEMENTS.add(HtmlTags.ORDEREDLIST); |
||||||
|
BLOCK_ELEMENTS.add(HtmlTags.TABLE); |
||||||
|
INLINE_ELEMENTS.add(HtmlTags.SPAN); |
||||||
|
INLINE_ELEMENTS.add(HtmlTags.IMAGE); |
||||||
|
INLINE_ELEMENTS.add(HtmlTags.STRONG); |
||||||
|
INLINE_ELEMENTS.add(HtmlTags.ANCHOR); |
||||||
|
INLINE_ELEMENTS.add(HtmlTags.SUB); |
||||||
|
INLINE_ELEMENTS.add(HtmlTags.SUP); |
||||||
|
INLINE_ELEMENTS.add(HtmlTags.I); |
||||||
|
INLINE_ELEMENTS.add(HtmlTags.U); |
||||||
|
INLINE_ELEMENTS.add(HtmlTags.EM); |
||||||
|
PADDING.add(Markup.CSS_KEY_PADDINGLEFT); |
||||||
|
PADDING.add(Markup.CSS_KEY_PADDINGRIGHT); |
||||||
|
PADDING.add(Markup.CSS_KEY_PADDINGTOP); |
||||||
|
PADDING.add(Markup.CSS_KEY_PADDINGBOTTOM); |
||||||
|
MARGIN.add(Markup.CSS_KEY_MARGINLEFT); |
||||||
|
MARGIN.add(Markup.CSS_KEY_MARGINRIGHT); |
||||||
|
MARGIN.add(Markup.CSS_KEY_MARGINTOP); |
||||||
|
MARGIN.add(Markup.CSS_KEY_MARGINBOTTOM); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,58 @@ |
|||||||
|
package com.fr.third.com.lowagie.text.pdf; |
||||||
|
|
||||||
|
import com.fr.third.com.lowagie.text.DocumentException; |
||||||
|
import com.fr.third.com.lowagie.text.html.CSSUtils; |
||||||
|
import com.fr.third.com.lowagie.text.html.Markup; |
||||||
|
|
||||||
|
import java.awt.Color; |
||||||
|
|
||||||
|
public class BorderStyle { |
||||||
|
private float borderWidth = 0.0f; |
||||||
|
private Color borderColor = Color.black; |
||||||
|
private String borderPattern = "solid"; |
||||||
|
|
||||||
|
public float getBorderWidth() { |
||||||
|
return borderWidth; |
||||||
|
} |
||||||
|
|
||||||
|
public void setBorderWidth(float borderWidth) { |
||||||
|
this.borderWidth = borderWidth; |
||||||
|
} |
||||||
|
|
||||||
|
public Color getBorderColor() { |
||||||
|
return borderColor; |
||||||
|
} |
||||||
|
|
||||||
|
public void setBorderColor(Color borderColor) { |
||||||
|
this.borderColor = borderColor; |
||||||
|
} |
||||||
|
|
||||||
|
public String getBorderPattern() { |
||||||
|
return borderPattern; |
||||||
|
} |
||||||
|
|
||||||
|
public void setBorderPattern(String borderPattern) { |
||||||
|
this.borderPattern = borderPattern; |
||||||
|
} |
||||||
|
|
||||||
|
public BorderStyle() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public BorderStyle(int borderWidth, String borderPattern, Color borderColor) { |
||||||
|
this.borderWidth = borderWidth; |
||||||
|
this.borderPattern = borderPattern; |
||||||
|
this.borderWidth = borderWidth; |
||||||
|
} |
||||||
|
|
||||||
|
public static BorderStyle parseBorderStyle(String borderString) throws DocumentException { |
||||||
|
BorderStyle borderStyle = new BorderStyle(); |
||||||
|
String[] borderPros = borderString.split(" "); |
||||||
|
borderStyle.setBorderWidth(CSSUtils.parseFloat(borderPros[0])); |
||||||
|
borderStyle.setBorderPattern(borderPros[1]); |
||||||
|
borderStyle.setBorderColor(Markup.decodeColor(borderPros[2])); |
||||||
|
return borderStyle; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,54 @@ |
|||||||
|
package com.fr.third.com.lowagie.text.pdf; |
||||||
|
|
||||||
|
import com.fr.third.com.lowagie.text.pdf.BorderStyle; |
||||||
|
|
||||||
|
/** |
||||||
|
* 描述table的属性类 |
||||||
|
* 包括cellspacing、cellpadding、border等 |
||||||
|
*/ |
||||||
|
public class TableProperties { |
||||||
|
private BorderStyle borderStyle = new BorderStyle(); |
||||||
|
private float cellspacing = 2.0f; |
||||||
|
private float cellpadding = 1.0f; |
||||||
|
private boolean collapse = false; |
||||||
|
|
||||||
|
public BorderStyle getBorderStyle() { |
||||||
|
return borderStyle; |
||||||
|
} |
||||||
|
|
||||||
|
public void setBorderStyle(BorderStyle borderStyle) { |
||||||
|
this.borderStyle = borderStyle; |
||||||
|
} |
||||||
|
|
||||||
|
public float getCellspacing() { |
||||||
|
return isCollapse() ? 0 : cellspacing; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCellspacing(float cellspacing) { |
||||||
|
this.cellspacing = cellspacing; |
||||||
|
} |
||||||
|
|
||||||
|
public float getCellpadding() { |
||||||
|
return cellpadding; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCellpadding(float cellpadding) { |
||||||
|
this.cellpadding = cellpadding; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isCollapse() { |
||||||
|
return collapse; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCollapse(boolean collapse) { |
||||||
|
this.collapse = collapse; |
||||||
|
} |
||||||
|
|
||||||
|
public String toHtmlString(){ |
||||||
|
StringBuffer sb = new StringBuffer(); |
||||||
|
sb.append("cellspacing").append("=").append(cellspacing).append(" "); |
||||||
|
sb.append("cellpadding").append("=").append(cellpadding).append(" "); |
||||||
|
sb.append("border").append("=").append(borderStyle.getBorderWidth()).append(" "); |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
} |
Binary file not shown.
@ -0,0 +1,63 @@ |
|||||||
|
package Sense4; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Lanlan |
||||||
|
* @date 2018/11/25 |
||||||
|
*/ |
||||||
|
public class Elite4 { |
||||||
|
|
||||||
|
public static byte[] readElite4Serial() { |
||||||
|
EliteLockIO eliteLockIO = LockUtils.getEliteLockIOInstance(); |
||||||
|
eliteLockIO.initS4(false); |
||||||
|
byte[] serial = eliteLockIO.readEliteSerial(); |
||||||
|
eliteLockIO.closeS4(); |
||||||
|
|
||||||
|
return serial; |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* Write byte[] to elite4 |
||||||
|
*/ |
||||||
|
public static boolean writeBytes2ToElite4(byte[] bytes) { |
||||||
|
EliteLockIO eliteLockIO = LockUtils.getEliteLockIOInstance(); |
||||||
|
eliteLockIO.initS4(true); |
||||||
|
|
||||||
|
byte[] write_len_bytes = LockUtils.intToByteArray1(bytes.length + 4); |
||||||
|
if (!eliteLockIO.write_internal_file(0, 4, write_len_bytes)) { |
||||||
|
eliteLockIO.closeS4(); |
||||||
|
return false; |
||||||
|
} |
||||||
|
if (!eliteLockIO.write_internal_file(4, bytes.length, bytes)) { |
||||||
|
eliteLockIO.closeS4(); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
eliteLockIO.closeS4(); |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* Read byte[] from elite4 |
||||||
|
*/ |
||||||
|
public static byte[] readBytesFromElitee4() { |
||||||
|
EliteLockIO eliteLockIO = LockUtils.getEliteLockIOInstance(); |
||||||
|
eliteLockIO.initS4(true); |
||||||
|
|
||||||
|
byte[] len_out = eliteLockIO.read_internal_file(0, 4); |
||||||
|
int read_len = LockUtils.byteArray2Int(len_out) - 4; |
||||||
|
|
||||||
|
if (read_len < 0) { |
||||||
|
eliteLockIO.closeS4(); |
||||||
|
return new byte[0]; |
||||||
|
} |
||||||
|
|
||||||
|
byte read_bytes[] = eliteLockIO.read_internal_file(4, read_len); |
||||||
|
eliteLockIO.closeS4(); |
||||||
|
|
||||||
|
return read_bytes; |
||||||
|
} |
||||||
|
|
||||||
|
public static String toHexString(byte[] b) { |
||||||
|
return LockUtils.toHexString(b); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package Sense4; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Lanlan |
||||||
|
* @date 2018/11/25 |
||||||
|
*/ |
||||||
|
public interface EliteLockIO { |
||||||
|
|
||||||
|
void initS4(boolean changeDir); |
||||||
|
|
||||||
|
void closeS4(); |
||||||
|
|
||||||
|
boolean write_internal_file(int offset, int write_len, byte[] write_bytes); |
||||||
|
|
||||||
|
byte[] read_internal_file(int offset, int read_len); |
||||||
|
|
||||||
|
boolean uploadHexExeFile(); |
||||||
|
|
||||||
|
byte[] readEliteSerial(); |
||||||
|
} |
@ -0,0 +1,277 @@ |
|||||||
|
package Sense4; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.FileInputStream; |
||||||
|
|
||||||
|
import Sense4.Sense32.S4CREATEDIRINFO; |
||||||
|
import Sense4.Sense32.S4OPENINFO; |
||||||
|
import Sense4.Sense32.SENSE4_CONTEXT; |
||||||
|
|
||||||
|
import com.sun.jna.ptr.IntByReference; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Lanlan |
||||||
|
* @date 2018/11/25 |
||||||
|
*/ |
||||||
|
public class EliteLockIO32 implements EliteLockIO { |
||||||
|
public static final int MAX_BUFF_SIZE = 0xf0; |
||||||
|
public static final byte WRITE = 0; |
||||||
|
public static final byte READ = 1; |
||||||
|
|
||||||
|
public SENSE4_CONTEXT ctx= new SENSE4_CONTEXT();//[] = new Sense4.SENSE4_CONTEXT[2];
|
||||||
|
|
||||||
|
public Sense32 lib = Sense32.instance; |
||||||
|
|
||||||
|
public EliteLockIO32() {} |
||||||
|
|
||||||
|
public void initS4(boolean changeDir) { |
||||||
|
IntByReference pSize = new IntByReference(0); |
||||||
|
|
||||||
|
int ret = lib.S4Enum(ctx, pSize); |
||||||
|
ret = lib.S4Enum(ctx, pSize); |
||||||
|
if(ret!=0) |
||||||
|
{ |
||||||
|
System.out.println("列举设备失败!"); |
||||||
|
} |
||||||
|
|
||||||
|
ret = lib.S4Open(ctx); |
||||||
|
if(ret!=0) |
||||||
|
{ |
||||||
|
System.out.println("打开设备失败!"); |
||||||
|
} |
||||||
|
|
||||||
|
if (changeDir) { |
||||||
|
ret = lib.S4ChangeDir(ctx, "\\"); |
||||||
|
if(ret!=0) |
||||||
|
{ |
||||||
|
System.out.println("切换目录失败!"); |
||||||
|
lib.S4Close(ctx); |
||||||
|
} |
||||||
|
|
||||||
|
ret = lib.S4VerifyPin(ctx, "12345678", 8, lib.S4_USER_PIN); |
||||||
|
if(ret!=0) |
||||||
|
{ |
||||||
|
System.out.println("校验用户pin失败!"); |
||||||
|
lib.S4Close(ctx); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public void closeS4() { |
||||||
|
int ret = lib.S4Close(ctx); |
||||||
|
|
||||||
|
if(ret!=0) |
||||||
|
{ |
||||||
|
System.out.println("关闭设备失败!"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public boolean write_internal_file(int offset, int write_len, byte[] write_bytes) { |
||||||
|
int write_offset = offset; |
||||||
|
int old_offset = write_offset; |
||||||
|
|
||||||
|
byte inBuffer[]=new byte[0xf8]; |
||||||
|
byte outBuffer[]=new byte[0xf8]; |
||||||
|
IntByReference pdwByteOut = new IntByReference(0); |
||||||
|
|
||||||
|
inBuffer[0]=WRITE; |
||||||
|
|
||||||
|
while (write_len > 0) { |
||||||
|
old_offset = write_offset; |
||||||
|
|
||||||
|
inBuffer[2]=(byte)((write_offset >> 8) & 0xFF); |
||||||
|
inBuffer[3]=(byte)(write_offset & 0xFF); |
||||||
|
|
||||||
|
if (write_len <= MAX_BUFF_SIZE) { |
||||||
|
System.arraycopy(write_bytes, old_offset - offset, inBuffer, 4, write_len); |
||||||
|
inBuffer[1] = (byte)(write_len & 0xFF); |
||||||
|
write_len = 0; |
||||||
|
write_offset += write_len; |
||||||
|
} else { |
||||||
|
System.arraycopy(write_bytes, old_offset - offset, inBuffer, 4, MAX_BUFF_SIZE); |
||||||
|
inBuffer[1] = (byte)MAX_BUFF_SIZE; |
||||||
|
write_len -= MAX_BUFF_SIZE; |
||||||
|
write_offset += MAX_BUFF_SIZE; |
||||||
|
} |
||||||
|
|
||||||
|
int ret = lib.S4Execute(ctx,"ef21",inBuffer,0xf8,outBuffer,0xf8, pdwByteOut); |
||||||
|
if(ret!=0) |
||||||
|
{ |
||||||
|
System.out.println("执行锁内程序失败!"); |
||||||
|
lib.S4Close(ctx); |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public byte[] read_internal_file(int offset, int read_len) { |
||||||
|
if (read_len < 0) { |
||||||
|
throw new IllegalArgumentException(); |
||||||
|
} |
||||||
|
|
||||||
|
int read_offset = offset; |
||||||
|
int old_offset = read_offset; |
||||||
|
|
||||||
|
byte[] out = new byte[read_len]; |
||||||
|
IntByReference pdwByteOut = new IntByReference(0); |
||||||
|
byte inBuffer[]=new byte[0xf8]; |
||||||
|
byte outBuffer[]=new byte[0xf8]; |
||||||
|
inBuffer[0]=READ; |
||||||
|
|
||||||
|
while (read_len > 0) { |
||||||
|
old_offset = read_offset; |
||||||
|
|
||||||
|
// big-edian
|
||||||
|
inBuffer[2]=(byte)((read_offset >> 8) & 0xFF); |
||||||
|
inBuffer[3]=(byte)(read_offset & 0xFF); |
||||||
|
|
||||||
|
if (read_len <= MAX_BUFF_SIZE) { |
||||||
|
inBuffer[1] = (byte)read_len; |
||||||
|
read_len = 0; |
||||||
|
read_offset += read_len; |
||||||
|
} else { |
||||||
|
inBuffer[1] = (byte)MAX_BUFF_SIZE; |
||||||
|
read_len -= MAX_BUFF_SIZE; |
||||||
|
read_offset += MAX_BUFF_SIZE; |
||||||
|
} |
||||||
|
|
||||||
|
int ret = lib.S4Execute(ctx, "ef21",inBuffer,0xf8,outBuffer,0xf8,pdwByteOut); |
||||||
|
if(ret!=0 || pdwByteOut.getValue() < inBuffer[1]) |
||||||
|
{ |
||||||
|
System.out.println("执行锁内程序失败!"); |
||||||
|
lib.S4Close(ctx); |
||||||
|
} else { |
||||||
|
System.arraycopy(outBuffer, 0, out, old_offset - offset, pdwByteOut.getValue()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean uploadHexExeFile() { |
||||||
|
Sense32 lib = Sense32.instance; |
||||||
|
|
||||||
|
IntByReference pSize = new IntByReference(0); |
||||||
|
int ret = 0; |
||||||
|
long errorCount = 0; |
||||||
|
|
||||||
|
IntByReference lpBytesReturned = new IntByReference(0); |
||||||
|
SENSE4_CONTEXT[] s4_context = new SENSE4_CONTEXT[0]; |
||||||
|
|
||||||
|
ret = lib.S4Enum(null, pSize); |
||||||
|
|
||||||
|
s4_context = new SENSE4_CONTEXT[pSize.getValue() / 92]; |
||||||
|
for (int i = 0;i< pSize.getValue() / 92; i++){ |
||||||
|
s4_context[i] = new SENSE4_CONTEXT(); |
||||||
|
} |
||||||
|
|
||||||
|
ret = lib.S4Enum(s4_context[0], pSize); |
||||||
|
checkS4ExceptionResult(ret, "Enumerate Sense4"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
S4OPENINFO s4_OpenInfo = new S4OPENINFO(); |
||||||
|
s4_OpenInfo.dwS4OpenInfoSize = 8; |
||||||
|
s4_OpenInfo.dwShareMode = lib.S4_EXCLUSIZE_MODE; |
||||||
|
|
||||||
|
ret = lib.S4OpenEx(s4_context[0], s4_OpenInfo); |
||||||
|
checkS4ExceptionResult(ret, "Open Sense4"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
byte [] frequency = {0x04}; |
||||||
|
ret = lib.S4Control(s4_context[0], lib.S4_LED_WINK, frequency, 1, null, 0, lpBytesReturned); |
||||||
|
checkS4ExceptionResult(ret, "Sense4 LED wink"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
ret = lib.S4ChangeDir (s4_context[0], "\\"); |
||||||
|
checkS4ExceptionResult(ret, "Change Dir"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
ret = lib.S4VerifyPin(s4_context[0], "123456781234567812345678", 24, lib.S4_DEV_PIN); |
||||||
|
checkS4ExceptionResult(ret, "Verify dev pin"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
ret = lib.S4EraseDir(s4_context[0], null); |
||||||
|
checkS4ExceptionResult(ret, "Erase MF"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
S4CREATEDIRINFO s4_CreateDirInfo = new S4CREATEDIRINFO(); |
||||||
|
s4_CreateDirInfo.dwS4CreateDirInfoSize = 12; |
||||||
|
s4_CreateDirInfo.szAtr[0] = (byte)0xFF; |
||||||
|
s4_CreateDirInfo.szAtr[1] = (byte)0xFF; |
||||||
|
s4_CreateDirInfo.szAtr[2] = (byte)0xFF; |
||||||
|
s4_CreateDirInfo.szAtr[3] = (byte)0xFF; |
||||||
|
s4_CreateDirInfo.szAtr[4] = (byte)0xFF; |
||||||
|
s4_CreateDirInfo.szAtr[5] = (byte)0xFF; |
||||||
|
s4_CreateDirInfo.szAtr[6] = (byte)0xFF; |
||||||
|
s4_CreateDirInfo.szAtr[7] = (byte)0xFF; |
||||||
|
|
||||||
|
ret = lib.S4CreateDirEx(s4_context[0], "\\", 0, lib.S4_CREATE_ROOT_DIR,s4_CreateDirInfo); |
||||||
|
checkS4ExceptionResult(ret, "Create MF"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
ret = lib.S4VerifyPin (s4_context[0], "123456781234567812345678", 24, lib.S4_DEV_PIN ); |
||||||
|
checkS4ExceptionResult(ret, "Verify Dev Pin"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
// write bin file ef21
|
||||||
|
File demofile = new File("ReadData.bin"); |
||||||
|
long contentsize = demofile.length (); |
||||||
|
byte [] content = new byte[1]; |
||||||
|
try |
||||||
|
{ |
||||||
|
FileInputStream is = new FileInputStream (demofile); |
||||||
|
content = new byte[(int)contentsize]; |
||||||
|
is.read(content, 0, (int)contentsize); |
||||||
|
is.close(); |
||||||
|
} |
||||||
|
catch(Exception e) |
||||||
|
{ |
||||||
|
System.out.println("error: read hex bing file "); |
||||||
|
} |
||||||
|
|
||||||
|
ret = lib.S4WriteFile (s4_context[0], "ef21", 0, content, (int)contentsize, (int)contentsize + 20, lpBytesReturned, |
||||||
|
lib.S4_CREATE_NEW , lib.S4_EXE_FILE ); |
||||||
|
checkS4ExceptionResult(ret, "Write hex bin file"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
// write data file bf21
|
||||||
|
byte[] data_file = new byte[0x6000]; |
||||||
|
|
||||||
|
ret = lib.S4WriteFile (s4_context[0], "bf21", 0, data_file, (int)data_file.length, (int)data_file.length + 20, lpBytesReturned, |
||||||
|
lib.S4_CREATE_NEW , lib.S4_DATA_FILE ); |
||||||
|
checkS4ExceptionResult(ret, "Write data file"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
ret = lib.S4Control (s4_context[0], lib.S4_LED_DOWN, null, 0, null, 0, lpBytesReturned); |
||||||
|
checkS4ExceptionResult(ret, "LED Down"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
ret = lib.S4Close(s4_context[0]); |
||||||
|
checkS4ExceptionResult(ret, "Close Sense4"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
return errorCount == 0; |
||||||
|
} |
||||||
|
|
||||||
|
public byte[] readEliteSerial() { |
||||||
|
byte[] serial = new byte[8]; |
||||||
|
int ret = lib.S4Control(ctx, lib.S4_GET_SERIAL_NUMBER, null, 0, serial, 8, null); |
||||||
|
if (ret != 0) { |
||||||
|
System.out.println("S4_GET_SERIAL_NUMBER: " + ret); |
||||||
|
} |
||||||
|
|
||||||
|
return serial; |
||||||
|
} |
||||||
|
|
||||||
|
private static void checkS4ExceptionResult(int ret, String info) { |
||||||
|
if (ret != 0) { |
||||||
|
System.out.println("Error Code: " + ret + " Info:" + info); |
||||||
|
} else { |
||||||
|
System.out.println("Success: " + info); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,274 @@ |
|||||||
|
package Sense4; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.FileInputStream; |
||||||
|
|
||||||
|
import Sense4.Sense64.S4CREATEDIRINFO; |
||||||
|
import Sense4.Sense64.S4OPENINFO; |
||||||
|
import Sense4.Sense64.SENSE4_CONTEXT; |
||||||
|
|
||||||
|
import com.sun.jna.ptr.IntByReference; |
||||||
|
import com.sun.jna.ptr.LongByReference; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Lanlan |
||||||
|
* @date 2018/11/25 |
||||||
|
*/ |
||||||
|
public class EliteLockIO64 implements EliteLockIO { |
||||||
|
public static final int MAX_BUFF_SIZE = 0xf0; |
||||||
|
public static final byte WRITE = 0; |
||||||
|
public static final byte READ = 1; |
||||||
|
|
||||||
|
public SENSE4_CONTEXT ctx= new SENSE4_CONTEXT();//[] = new Sense4.SENSE4_CONTEXT[2];
|
||||||
|
|
||||||
|
public Sense64 lib = Sense64.instance; |
||||||
|
|
||||||
|
public EliteLockIO64() {} |
||||||
|
|
||||||
|
public void initS4(boolean changeDir) { |
||||||
|
LongByReference pSize = new LongByReference(0); |
||||||
|
|
||||||
|
long ret = lib.S4Enum(ctx, pSize); |
||||||
|
ret = lib.S4Enum(ctx, pSize); |
||||||
|
if(ret!=0) |
||||||
|
{ |
||||||
|
System.out.println("List列举设备失败!" + ret); |
||||||
|
} |
||||||
|
|
||||||
|
ret = lib.S4Open(ctx); |
||||||
|
if(ret!=0) |
||||||
|
{ |
||||||
|
System.out.println("Open打开设备失败!" + ret); |
||||||
|
} |
||||||
|
|
||||||
|
if (changeDir) { |
||||||
|
ret = lib.S4ChangeDir(ctx, "\\"); |
||||||
|
if(ret!=0) |
||||||
|
{ |
||||||
|
System.out.println("Change切换目录失败!" + ret); |
||||||
|
lib.S4Close(ctx); |
||||||
|
} |
||||||
|
|
||||||
|
ret = lib.S4VerifyPin(ctx, "12345678", 8, lib.S4_USER_PIN); |
||||||
|
if(ret!=0) |
||||||
|
{ |
||||||
|
System.out.println("Verify校验用户pin失败!" + ret); |
||||||
|
lib.S4Close(ctx); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void closeS4() { |
||||||
|
long ret = lib.S4Close(ctx); |
||||||
|
|
||||||
|
if(ret!=0) |
||||||
|
{ |
||||||
|
System.out.println("Close关闭设备失败!" + ret); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public boolean write_internal_file(int offset, int write_len, byte[] write_bytes) { |
||||||
|
int write_offset = offset; |
||||||
|
int old_offset = write_offset; |
||||||
|
|
||||||
|
byte inBuffer[]=new byte[0xf8]; |
||||||
|
byte outBuffer[]=new byte[0xf8]; |
||||||
|
IntByReference pdwByteOut = new IntByReference(0); |
||||||
|
|
||||||
|
inBuffer[0]=WRITE; |
||||||
|
|
||||||
|
while (write_len > 0) { |
||||||
|
old_offset = write_offset; |
||||||
|
|
||||||
|
inBuffer[2]=(byte)((write_offset >> 8) & 0xFF); |
||||||
|
inBuffer[3]=(byte)(write_offset & 0xFF); |
||||||
|
|
||||||
|
if (write_len <= MAX_BUFF_SIZE) { |
||||||
|
System.arraycopy(write_bytes, old_offset - offset, inBuffer, 4, write_len); |
||||||
|
inBuffer[1] = (byte)(write_len & 0xFF); |
||||||
|
write_len = 0; |
||||||
|
write_offset += write_len; |
||||||
|
} else { |
||||||
|
System.arraycopy(write_bytes, old_offset - offset, inBuffer, 4, MAX_BUFF_SIZE); |
||||||
|
inBuffer[1] = (byte)MAX_BUFF_SIZE; |
||||||
|
write_len -= MAX_BUFF_SIZE; |
||||||
|
write_offset += MAX_BUFF_SIZE; |
||||||
|
} |
||||||
|
|
||||||
|
int ret = lib.S4Execute(ctx,"ef21",inBuffer,0xf8,outBuffer,0xf8, pdwByteOut); |
||||||
|
if(ret!=0) |
||||||
|
{ |
||||||
|
System.out.println("执行锁内程序失败!"); |
||||||
|
lib.S4Close(ctx); |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public byte[] read_internal_file(int offset, int read_len) { |
||||||
|
int read_offset = offset; |
||||||
|
int old_offset = read_offset; |
||||||
|
|
||||||
|
byte[] out = new byte[read_len]; |
||||||
|
IntByReference pdwByteOut = new IntByReference(0); |
||||||
|
byte inBuffer[]=new byte[0xf8]; |
||||||
|
byte outBuffer[]=new byte[0xf8]; |
||||||
|
inBuffer[0]=READ; |
||||||
|
|
||||||
|
while (read_len > 0) { |
||||||
|
old_offset = read_offset; |
||||||
|
|
||||||
|
inBuffer[2]=(byte)((read_offset >> 8) & 0xFF); |
||||||
|
inBuffer[3]=(byte)(read_offset & 0xFF); |
||||||
|
|
||||||
|
if (read_len <= MAX_BUFF_SIZE) { |
||||||
|
inBuffer[1] = (byte)read_len; |
||||||
|
read_len = 0; |
||||||
|
read_offset += read_len; |
||||||
|
} else { |
||||||
|
inBuffer[1] = (byte)MAX_BUFF_SIZE; |
||||||
|
read_len -= MAX_BUFF_SIZE; |
||||||
|
read_offset += MAX_BUFF_SIZE; |
||||||
|
} |
||||||
|
|
||||||
|
long ret = lib.S4Execute(ctx, "ef21",inBuffer,0xf8,outBuffer,0xf8,pdwByteOut); |
||||||
|
if(ret!=0 || pdwByteOut.getValue() < inBuffer[1]) |
||||||
|
{ |
||||||
|
|
||||||
|
System.out.println("执行锁内程序失败!"); |
||||||
|
lib.S4Close(ctx); |
||||||
|
} else { |
||||||
|
System.arraycopy(outBuffer, 0, out, old_offset - offset, (int)pdwByteOut.getValue()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean uploadHexExeFile() { |
||||||
|
Sense64 lib = Sense64.instance; |
||||||
|
|
||||||
|
LongByReference pSize = new LongByReference(0); |
||||||
|
long ret = 0; |
||||||
|
long errorCount = 0; |
||||||
|
|
||||||
|
LongByReference lpBytesReturned = new LongByReference(0); |
||||||
|
SENSE4_CONTEXT[] s4_context = new SENSE4_CONTEXT[0]; |
||||||
|
|
||||||
|
ret = lib.S4Enum(null, pSize); |
||||||
|
|
||||||
|
s4_context = new SENSE4_CONTEXT[(int)pSize.getValue() / 92]; |
||||||
|
for (int i = 0;i< pSize.getValue() / 92; i++){ |
||||||
|
s4_context[i] = new SENSE4_CONTEXT(); |
||||||
|
} |
||||||
|
|
||||||
|
ret = lib.S4Enum(s4_context[0], pSize); |
||||||
|
checkS4ExceptionResult(ret, "Enumerate Sense4"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
S4OPENINFO s4_OpenInfo = new S4OPENINFO(); |
||||||
|
s4_OpenInfo.dwS4OpenInfoSize = 8; |
||||||
|
s4_OpenInfo.dwShareMode = lib.S4_EXCLUSIZE_MODE; |
||||||
|
|
||||||
|
ret = lib.S4OpenEx(s4_context[0], s4_OpenInfo); |
||||||
|
checkS4ExceptionResult(ret, "Open Sense4"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
byte [] frequency = {0x04}; |
||||||
|
ret = lib.S4Control(s4_context[0], lib.S4_LED_WINK, frequency, 1, null, 0, lpBytesReturned); |
||||||
|
checkS4ExceptionResult(ret, "Sense4 LED wink"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
ret = lib.S4ChangeDir (s4_context[0], "\\"); |
||||||
|
checkS4ExceptionResult(ret, "Change Dir"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
ret = lib.S4VerifyPin(s4_context[0], "123456781234567812345678", 24, lib.S4_DEV_PIN); |
||||||
|
checkS4ExceptionResult(ret, "Verify dev pin"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
ret = lib.S4EraseDir(s4_context[0], null); |
||||||
|
checkS4ExceptionResult(ret, "Erase MF"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
S4CREATEDIRINFO s4_CreateDirInfo = new S4CREATEDIRINFO(); |
||||||
|
s4_CreateDirInfo.dwS4CreateDirInfoSize = 12; |
||||||
|
s4_CreateDirInfo.szAtr[0] = (byte)0xFF; |
||||||
|
s4_CreateDirInfo.szAtr[1] = (byte)0xFF; |
||||||
|
s4_CreateDirInfo.szAtr[2] = (byte)0xFF; |
||||||
|
s4_CreateDirInfo.szAtr[3] = (byte)0xFF; |
||||||
|
s4_CreateDirInfo.szAtr[4] = (byte)0xFF; |
||||||
|
s4_CreateDirInfo.szAtr[5] = (byte)0xFF; |
||||||
|
s4_CreateDirInfo.szAtr[6] = (byte)0xFF; |
||||||
|
s4_CreateDirInfo.szAtr[7] = (byte)0xFF; |
||||||
|
|
||||||
|
ret = lib.S4CreateDirEx(s4_context[0], "\\", 0, lib.S4_CREATE_ROOT_DIR,s4_CreateDirInfo); |
||||||
|
checkS4ExceptionResult(ret, "Create MF"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
ret = lib.S4VerifyPin (s4_context[0], "123456781234567812345678", 24, lib.S4_DEV_PIN ); |
||||||
|
checkS4ExceptionResult(ret, "Verify Dev Pin"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
// write bin file ef21
|
||||||
|
File demofile = new File("ReadData.bin"); |
||||||
|
long contentsize = demofile.length (); |
||||||
|
byte [] content = new byte[1]; |
||||||
|
try |
||||||
|
{ |
||||||
|
FileInputStream is = new FileInputStream (demofile); |
||||||
|
content = new byte[(int)contentsize]; |
||||||
|
is.read(content, 0, (int)contentsize); |
||||||
|
is.close(); |
||||||
|
} |
||||||
|
catch(Exception e) |
||||||
|
{ |
||||||
|
e.printStackTrace(); |
||||||
|
System.out.println("error: read hex bing file "); |
||||||
|
} |
||||||
|
|
||||||
|
ret = lib.S4WriteFile (s4_context[0], "ef21", 0, content, (int)contentsize, (int)contentsize + 20, lpBytesReturned, |
||||||
|
lib.S4_CREATE_NEW , lib.S4_EXE_FILE ); |
||||||
|
checkS4ExceptionResult(ret, "Write hex bin file"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
// write data file bf21
|
||||||
|
byte[] data_file = new byte[0x6000]; |
||||||
|
|
||||||
|
ret = lib.S4WriteFile (s4_context[0], "bf21", 0, data_file, (int)data_file.length, (int)data_file.length + 20, lpBytesReturned, |
||||||
|
lib.S4_CREATE_NEW , lib.S4_DATA_FILE ); |
||||||
|
checkS4ExceptionResult(ret, "Write data file"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
ret = lib.S4Control (s4_context[0], lib.S4_LED_DOWN, null, 0, null, 0, lpBytesReturned); |
||||||
|
checkS4ExceptionResult(ret, "LED Down"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
ret = lib.S4Close(s4_context[0]); |
||||||
|
checkS4ExceptionResult(ret, "Close Sense4"); |
||||||
|
errorCount += ret; |
||||||
|
|
||||||
|
return errorCount == 0; |
||||||
|
} |
||||||
|
|
||||||
|
private static void checkS4ExceptionResult(long ret, String info) { |
||||||
|
if (ret != 0) { |
||||||
|
System.out.println("Error Code: " + ret + " Info:" + info); |
||||||
|
} else { |
||||||
|
System.out.println("Success: " + info); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public byte[] readEliteSerial() { |
||||||
|
byte[] serial = new byte[8]; |
||||||
|
long ret = lib.S4Control(ctx, lib.S4_GET_SERIAL_NUMBER, null, 0, serial, 8, null); |
||||||
|
if (ret != 0) { |
||||||
|
System.out.println("S4_GET_SERIAL_NUMBER: " + ret); |
||||||
|
} |
||||||
|
|
||||||
|
return serial; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,65 @@ |
|||||||
|
package Sense4; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Lanlan |
||||||
|
* @date 2018/11/25 |
||||||
|
*/ |
||||||
|
public abstract class LockUtils { |
||||||
|
|
||||||
|
private static EliteLockIO intance; |
||||||
|
|
||||||
|
public static boolean isJVMSystem32() { |
||||||
|
String arch_model = System.getProperty("sun.arch.data.model"); |
||||||
|
|
||||||
|
return "32".equals(arch_model); |
||||||
|
} |
||||||
|
|
||||||
|
// big-endian
|
||||||
|
public static byte[] intToByteArray1(int i) { |
||||||
|
byte[] result = new byte[4]; |
||||||
|
result[0] = (byte)((i >> 24) & 0xFF); |
||||||
|
result[1] = (byte)((i >> 16) & 0xFF); |
||||||
|
result[2] = (byte)((i >> 8) & 0xFF); |
||||||
|
result[3] = (byte)(i & 0xFF); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
// big-endian
|
||||||
|
public static int byteArray2Int(byte[] bytes) { |
||||||
|
int res = 0; |
||||||
|
res += (bytes[0] & 0xff) << 24; |
||||||
|
res += (bytes[1] & 0xff) << 16; |
||||||
|
res += (bytes[2] & 0xff)<< 8; |
||||||
|
res += bytes[3] & 0xff; |
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
public static String toHexString(byte[] b) { |
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
for (int i = 0; i < b.length; i++) { |
||||||
|
String hex = Integer.toHexString(b[i] & 0xFF); |
||||||
|
if (hex.length() == 1) { |
||||||
|
hex = "0" + hex; |
||||||
|
} |
||||||
|
sb.append(hex); |
||||||
|
} |
||||||
|
|
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
System.out.println("System is 32-bit: " + isJVMSystem32()); |
||||||
|
} |
||||||
|
|
||||||
|
public static EliteLockIO getEliteLockIOInstance() { |
||||||
|
if (intance == null) { |
||||||
|
if (isJVMSystem32()) { |
||||||
|
intance = new EliteLockIO32(); |
||||||
|
} else { |
||||||
|
intance = new EliteLockIO64(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return intance; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,218 @@ |
|||||||
|
package Sense4; |
||||||
|
|
||||||
|
import com.sun.jna.Native; |
||||||
|
import com.sun.jna.Structure; |
||||||
|
import com.sun.jna.ptr.IntByReference; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public interface Sense32 extends com.sun.jna.Library |
||||||
|
{ |
||||||
|
Sense32 instance = (Sense32) Native.loadLibrary("EL", Sense32.class); |
||||||
|
|
||||||
|
public static final int S4_USER_PIN = 0x000000a1; |
||||||
|
public static final int S4_DEV_PIN = 0x000000a2; |
||||||
|
public static final int S4_AUTHEN_PIN = 0x000000a3; |
||||||
|
public static final int S4_CREATE_NEW = 0x000000a5; |
||||||
|
public static final int S4_UPDATE_FILE = 0x000000a6; |
||||||
|
|
||||||
|
// #define S4_EXE_FILE 0x00000008 /** executable file of virtual machine*/
|
||||||
|
public static final byte S4_EXE_FILE = 0x00000008; |
||||||
|
public static final byte S4_DATA_FILE = 0x00000009; |
||||||
|
public static final int S4_FILE_EXIST = 0x00006a80; |
||||||
|
|
||||||
|
// #define S4_LED_DOWN 0x00000008 /** LED down*/
|
||||||
|
public static final int S4_LED_DOWN = 0x00000008; |
||||||
|
// #define S4_LED_WINK 0x00000028 /** LED wink*/
|
||||||
|
public static final int S4_LED_WINK = 0x00000028; |
||||||
|
|
||||||
|
public static final int S4_GET_SERIAL_NUMBER = 0x00000026; |
||||||
|
|
||||||
|
// #define S4_EXCLUSIZE_MODE 0 /** exclusive mode*/
|
||||||
|
// #define S4_SHARE_MODE 1 /** sharable mode*/
|
||||||
|
public static final int S4_EXCLUSIZE_MODE = 0x00000000; |
||||||
|
public static final int S4_SHARE_MODE = 0x00000001; |
||||||
|
|
||||||
|
// #define S4_CREATE_ROOT_DIR 0x000000ab /** create root directory*/
|
||||||
|
public static final int S4_CREATE_ROOT_DIR = 0x000000ab; |
||||||
|
|
||||||
|
public static class RTC_TIME_T extends Structure |
||||||
|
{ |
||||||
|
|
||||||
|
public byte second; /* second (0-59) */ |
||||||
|
public byte minute; /* minute (0-59) */ |
||||||
|
public byte hour; /* hour (0-23) */ |
||||||
|
public byte day; /* day of month (1-31) */ |
||||||
|
public byte week; /* day of week (0-6, sunday is 0) */ |
||||||
|
public byte month; /* month (0-11) */ |
||||||
|
public short year; /* year (0- 138, 1900 - 2038) */ |
||||||
|
protected List<String> getFieldOrder() { |
||||||
|
List<String> list = new ArrayList<String>(); |
||||||
|
list.add("second"); |
||||||
|
list.add("minute"); |
||||||
|
list.add("hour"); |
||||||
|
list.add("day"); |
||||||
|
list.add("week"); |
||||||
|
list.add("month"); |
||||||
|
list.add("year"); |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class SENSE4_CONTEXT extends Structure { |
||||||
|
public int dwIndex; /** device index; index begins at zero*/ |
||||||
|
public int dwVersion; /** device version*/ |
||||||
|
public int hLock; /** device handle*/ |
||||||
|
public byte[] reserve = new byte[12*2]; /** reserved*/ |
||||||
|
public byte[] bAtr = new byte[56]; /** ATR*/ |
||||||
|
public byte[] bID = new byte[8]; /** device ID*/ |
||||||
|
public int dwAtrLen; /** ATR length*/ |
||||||
|
protected List<String> getFieldOrder() { |
||||||
|
List<String> list = new ArrayList<String>(); |
||||||
|
list.add("dwIndex"); |
||||||
|
list.add("dwVersion"); |
||||||
|
list.add("hLock"); |
||||||
|
list.add("reserve"); |
||||||
|
list.add("bAtr"); |
||||||
|
list.add("bID"); |
||||||
|
list.add("dwAtrLen"); |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** Netlock Module infomation definition*/ |
||||||
|
// typedef struct _S4MODULEINFO {
|
||||||
|
// WORD wModuleID; /* Module ID*/
|
||||||
|
// WORD wLicenseCount; /* License Count */
|
||||||
|
// } S4MODULEINFO;
|
||||||
|
public static class S4MODULEINFO extends Structure { |
||||||
|
public short wModuleID; |
||||||
|
public short wLicenseCount; |
||||||
|
protected List<String> getFieldOrder() { |
||||||
|
List<String> list = new ArrayList<String>(); |
||||||
|
list.add("wModuleID"); |
||||||
|
list.add("wLicenseCount"); |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// typedef struct _S4NETCONFIG {
|
||||||
|
// DWORD dwLicenseMode; /* License Mode */
|
||||||
|
// DWORD dwModuleCount; /* Module Count */
|
||||||
|
// S4MODULEINFO ModuleInfo[16]; /* Module detail infomation */
|
||||||
|
// } S4NETCONFIG;
|
||||||
|
public static class S4NETCONFIG extends Structure { |
||||||
|
public int dwLicenseMode; |
||||||
|
public int dwModuleCount; |
||||||
|
public S4MODULEINFO[] ModuleInfo = new S4MODULEINFO[16]; |
||||||
|
protected List<String> getFieldOrder() { |
||||||
|
List<String> list = new ArrayList<String>(); |
||||||
|
list.add("dwLicenseMode"); |
||||||
|
list.add("dwModuleCount"); |
||||||
|
list.add("ModuleInfo"); |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// S4CREATEDIRINFO structure definition
|
||||||
|
// typedef struct _S4CREATEDIRINFO {
|
||||||
|
// DWORD dwS4CreateDirInfoSize; /* size of the structure*/
|
||||||
|
// BYTE szAtr[8]; /* ATR information */
|
||||||
|
// S4NETCONFIG NetConfig; /* netlock config infomation */
|
||||||
|
// } S4CREATEDIRINFO;
|
||||||
|
public static class S4CREATEDIRINFO extends Structure { |
||||||
|
public int dwS4CreateDirInfoSize; |
||||||
|
public byte[] szAtr = new byte[8]; |
||||||
|
public S4NETCONFIG NetConfig; |
||||||
|
protected List<String> getFieldOrder() { |
||||||
|
List<String> list = new ArrayList<String>(); |
||||||
|
list.add("dwS4CreateDirInfoSize"); |
||||||
|
list.add("szAtr"); |
||||||
|
list.add("NetConfig"); |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// typedef struct _S4OPENINFO {
|
||||||
|
// DWORD dwS4OpenInfoSize; /* size of the structure*/
|
||||||
|
// DWORD dwShareMode; /* share mode*/
|
||||||
|
// } S4OPENINFO;
|
||||||
|
public static class S4OPENINFO extends Structure { |
||||||
|
public int dwS4OpenInfoSize; |
||||||
|
public int dwShareMode; |
||||||
|
protected List<String> getFieldOrder() { |
||||||
|
List<String> list = new ArrayList<String>(); |
||||||
|
list.add("dwS4OpenInfoSize"); |
||||||
|
list.add("dwShareMode"); |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public int S4Enum(SENSE4_CONTEXT ctx, IntByReference pSize); |
||||||
|
|
||||||
|
|
||||||
|
public int S4Open(SENSE4_CONTEXT ctx); |
||||||
|
|
||||||
|
// DWORD WINAPI S4Control(
|
||||||
|
// IN SENSE4_CONTEXT *pS4Ctx,
|
||||||
|
// IN DWORD dwCtlCode,
|
||||||
|
// IN VOID *pInBuffer,
|
||||||
|
// IN DWORD dwInBufferLen,
|
||||||
|
// OUT VOID *pOutBuffer,
|
||||||
|
// IN DWORD dwOutBufferLen,
|
||||||
|
// OUT DWORD *pdwBytesReturned
|
||||||
|
// );
|
||||||
|
public int S4Control( |
||||||
|
SENSE4_CONTEXT ctx, |
||||||
|
int dwCtlCode, |
||||||
|
byte[] pInBuffer, |
||||||
|
int dwInBufferLen, |
||||||
|
byte[] pOutBuffer, |
||||||
|
int dwOutBufferLen, |
||||||
|
IntByReference pdwBytesReturned |
||||||
|
); |
||||||
|
|
||||||
|
public int S4ChangeDir(SENSE4_CONTEXT ctx, String dir); |
||||||
|
|
||||||
|
//
|
||||||
|
public int S4EraseDir(SENSE4_CONTEXT ctx, String dir); |
||||||
|
|
||||||
|
public int S4VerifyPin(SENSE4_CONTEXT ctx, String passwd, int passwdLen, int type); |
||||||
|
public int S4WriteFile(SENSE4_CONTEXT ctx, |
||||||
|
String lpszFileID, |
||||||
|
int dwOffset, |
||||||
|
byte lpBuffer[], |
||||||
|
int dwBufferSize, |
||||||
|
int dwFileSize, |
||||||
|
IntByReference pdwBytesWritten, |
||||||
|
int dwFlags, |
||||||
|
byte bFileType); |
||||||
|
|
||||||
|
|
||||||
|
public int S4Execute(SENSE4_CONTEXT ctx, String fileID, byte[] inputBuf, int inputSize, byte[] outputBuf, int outputSize, IntByReference pSize); |
||||||
|
public int S4Close(SENSE4_CONTEXT ctx); |
||||||
|
|
||||||
|
// DWORD WINAPI S4CreateDirEx(
|
||||||
|
// IN SENSE4_CONTEXT *pS4Ctx,
|
||||||
|
// IN LPCSTR lpszDirID,
|
||||||
|
// IN DWORD dwDirSize,
|
||||||
|
// IN DWORD dwFlags,
|
||||||
|
// IN S4CREATEDIRINFO *pCreateDirInfo
|
||||||
|
// );
|
||||||
|
public int S4CreateDirEx( |
||||||
|
SENSE4_CONTEXT ctx, |
||||||
|
String lpszDirID, |
||||||
|
int dwDirSize, |
||||||
|
int dwFlags, |
||||||
|
S4CREATEDIRINFO pCreateDirInfo |
||||||
|
); |
||||||
|
|
||||||
|
// DWORD WINAPI S4OpenEx(
|
||||||
|
// IN OUT SENSE4_CONTEXT *pS4Ctx,
|
||||||
|
// IN S4OPENINFO *pS4OpenInfo
|
||||||
|
// );
|
||||||
|
|
||||||
|
public int S4OpenEx(SENSE4_CONTEXT ctx, S4OPENINFO pS4OpenInfo); |
||||||
|
} |
@ -0,0 +1,219 @@ |
|||||||
|
package Sense4; |
||||||
|
|
||||||
|
import com.sun.jna.Native; |
||||||
|
import com.sun.jna.Structure; |
||||||
|
import com.sun.jna.ptr.IntByReference; |
||||||
|
import com.sun.jna.ptr.LongByReference; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public interface Sense64 extends com.sun.jna.Library |
||||||
|
{ |
||||||
|
Sense64 instance = (Sense64) Native.loadLibrary("EL", Sense64.class); |
||||||
|
|
||||||
|
public static final long S4_USER_PIN = 0x000000a1; |
||||||
|
public static final long S4_DEV_PIN = 0x000000a2; |
||||||
|
public static final long S4_AUTHEN_PIN = 0x000000a3; |
||||||
|
public static final long S4_CREATE_NEW = 0x000000a5; |
||||||
|
public static final long S4_UPDATE_FILE = 0x000000a6; |
||||||
|
|
||||||
|
// #define S4_EXE_FILE 0x00000008 /** executable file of virtual machine*/
|
||||||
|
public static final byte S4_EXE_FILE = 0x00000008; |
||||||
|
public static final byte S4_DATA_FILE = 0x00000009; |
||||||
|
public static final long S4_FILE_EXIST = 0x00006a80; |
||||||
|
|
||||||
|
// #define S4_LED_DOWN 0x00000008 /** LED down*/
|
||||||
|
public static final long S4_LED_DOWN = 0x00000008; |
||||||
|
// #define S4_LED_WINK 0x00000028 /** LED wink*/
|
||||||
|
public static final long S4_LED_WINK = 0x00000028; |
||||||
|
|
||||||
|
public static final long S4_GET_SERIAL_NUMBER = 0x00000026; |
||||||
|
|
||||||
|
// #define S4_EXCLUSIZE_MODE 0 /** exclusive mode*/
|
||||||
|
// #define S4_SHARE_MODE 1 /** sharable mode*/
|
||||||
|
public static final long S4_EXCLUSIZE_MODE = 0x00000000; |
||||||
|
public static final long S4_SHARE_MODE = 0x00000001; |
||||||
|
|
||||||
|
// #define S4_CREATE_ROOT_DIR 0x000000ab /** create root directory*/
|
||||||
|
public static final long S4_CREATE_ROOT_DIR = 0x000000ab; |
||||||
|
|
||||||
|
public static class RTC_TIME_T extends Structure |
||||||
|
{ |
||||||
|
|
||||||
|
public byte second; /* second (0-59) */ |
||||||
|
public byte minute; /* minute (0-59) */ |
||||||
|
public byte hour; /* hour (0-23) */ |
||||||
|
public byte day; /* day of month (1-31) */ |
||||||
|
public byte week; /* day of week (0-6, sunday is 0) */ |
||||||
|
public byte month; /* month (0-11) */ |
||||||
|
public short year; /* year (0- 138, 1900 - 2038) */ |
||||||
|
protected List<String> getFieldOrder() { |
||||||
|
List<String> list = new ArrayList<String>(); |
||||||
|
list.add("second"); |
||||||
|
list.add("minute"); |
||||||
|
list.add("hour"); |
||||||
|
list.add("day"); |
||||||
|
list.add("week"); |
||||||
|
list.add("month"); |
||||||
|
list.add("year"); |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class SENSE4_CONTEXT extends Structure { |
||||||
|
public long dwIndex; /** device index; index begins at zero*/ |
||||||
|
public long dwVersion; /** device version*/ |
||||||
|
public long hLock; /** device handle*/ |
||||||
|
public byte[] reserve = new byte[12*2]; /** reserved*/ |
||||||
|
public byte[] bAtr = new byte[56]; /** ATR*/ |
||||||
|
public byte[] bID = new byte[8]; /** device ID*/ |
||||||
|
public long dwAtrLen; /** ATR length*/ |
||||||
|
protected List<String> getFieldOrder() { |
||||||
|
List<String> list = new ArrayList<String>(); |
||||||
|
list.add("dwIndex"); |
||||||
|
list.add("dwVersion"); |
||||||
|
list.add("hLock"); |
||||||
|
list.add("reserve"); |
||||||
|
list.add("bAtr"); |
||||||
|
list.add("bID"); |
||||||
|
list.add("dwAtrLen"); |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** Netlock Module infomation definition*/ |
||||||
|
// typedef struct _S4MODULEINFO {
|
||||||
|
// WORD wModuleID; /* Module ID*/
|
||||||
|
// WORD wLicenseCount; /* License Count */
|
||||||
|
// } S4MODULEINFO;
|
||||||
|
public static class S4MODULEINFO extends Structure { |
||||||
|
public int wModuleID; |
||||||
|
public int wLicenseCount; |
||||||
|
protected List<String> getFieldOrder() { |
||||||
|
List<String> list = new ArrayList<String>(); |
||||||
|
list.add("wModuleID"); |
||||||
|
list.add("wLicenseCount"); |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// typedef struct _S4NETCONFIG {
|
||||||
|
// DWORD dwLicenseMode; /* License Mode */
|
||||||
|
// DWORD dwModuleCount; /* Module Count */
|
||||||
|
// S4MODULEINFO ModuleInfo[16]; /* Module detail infomation */
|
||||||
|
// } S4NETCONFIG;
|
||||||
|
public static class S4NETCONFIG extends Structure { |
||||||
|
public long dwLicenseMode; |
||||||
|
public long dwModuleCount; |
||||||
|
public S4MODULEINFO[] ModuleInfo = new S4MODULEINFO[16]; |
||||||
|
protected List<String> getFieldOrder() { |
||||||
|
List<String> list = new ArrayList<String>(); |
||||||
|
list.add("dwLicenseMode"); |
||||||
|
list.add("dwModuleCount"); |
||||||
|
list.add("ModuleInfo"); |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// S4CREATEDIRINFO structure definition
|
||||||
|
// typedef struct _S4CREATEDIRINFO {
|
||||||
|
// DWORD dwS4CreateDirInfoSize; /* size of the structure*/
|
||||||
|
// BYTE szAtr[8]; /* ATR information */
|
||||||
|
// S4NETCONFIG NetConfig; /* netlock config infomation */
|
||||||
|
// } S4CREATEDIRINFO;
|
||||||
|
public static class S4CREATEDIRINFO extends Structure { |
||||||
|
public long dwS4CreateDirInfoSize; |
||||||
|
public byte[] szAtr = new byte[8]; |
||||||
|
public S4NETCONFIG NetConfig; |
||||||
|
protected List<String> getFieldOrder() { |
||||||
|
List<String> list = new ArrayList<String>(); |
||||||
|
list.add("dwS4CreateDirInfoSize"); |
||||||
|
list.add("szAtr"); |
||||||
|
list.add("NetConfig"); |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// typedef struct _S4OPENINFO {
|
||||||
|
// DWORD dwS4OpenInfoSize; /* size of the structure*/
|
||||||
|
// DWORD dwShareMode; /* share mode*/
|
||||||
|
// } S4OPENINFO;
|
||||||
|
public static class S4OPENINFO extends Structure { |
||||||
|
public long dwS4OpenInfoSize; |
||||||
|
public long dwShareMode; |
||||||
|
protected List<String> getFieldOrder() { |
||||||
|
List<String> list = new ArrayList<String>(); |
||||||
|
list.add("dwS4OpenInfoSize"); |
||||||
|
list.add("dwShareMode"); |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public long S4Enum(SENSE4_CONTEXT ctx, LongByReference pSize); |
||||||
|
|
||||||
|
|
||||||
|
public long S4Open(SENSE4_CONTEXT ctx); |
||||||
|
|
||||||
|
// DWORD WINAPI S4Control(
|
||||||
|
// IN SENSE4_CONTEXT *pS4Ctx,
|
||||||
|
// IN DWORD dwCtlCode,
|
||||||
|
// IN VOID *pInBuffer,
|
||||||
|
// IN DWORD dwInBufferLen,
|
||||||
|
// OUT VOID *pOutBuffer,
|
||||||
|
// IN DWORD dwOutBufferLen,
|
||||||
|
// OUT DWORD *pdwBytesReturned
|
||||||
|
// );
|
||||||
|
public long S4Control( |
||||||
|
SENSE4_CONTEXT ctx, |
||||||
|
long dwCtlCode, |
||||||
|
byte[] pInBuffer, |
||||||
|
long dwInBufferLen, |
||||||
|
byte[] pOutBuffer, |
||||||
|
long dwOutBufferLen, |
||||||
|
LongByReference pdwBytesReturned |
||||||
|
); |
||||||
|
|
||||||
|
public long S4ChangeDir(SENSE4_CONTEXT ctx, String dir); |
||||||
|
|
||||||
|
//
|
||||||
|
public long S4EraseDir(SENSE4_CONTEXT ctx, String dir); |
||||||
|
|
||||||
|
public long S4VerifyPin(SENSE4_CONTEXT ctx, String passwd, long passwdLen, long type); |
||||||
|
public long S4WriteFile(SENSE4_CONTEXT ctx, |
||||||
|
String lpszFileID, |
||||||
|
long dwOffset, |
||||||
|
byte lpBuffer[], |
||||||
|
long dwBufferSize, |
||||||
|
long dwFileSize, |
||||||
|
LongByReference pdwBytesWritten, |
||||||
|
long dwFlags, |
||||||
|
byte bFileType); |
||||||
|
|
||||||
|
|
||||||
|
public int S4Execute(Sense64.SENSE4_CONTEXT ctx, String fileID, byte[] inputBuf, int inputSize, byte[] outputBuf, int outputSize, IntByReference pSize); |
||||||
|
public long S4Close(SENSE4_CONTEXT ctx); |
||||||
|
|
||||||
|
// DWORD WINAPI S4CreateDirEx(
|
||||||
|
// IN SENSE4_CONTEXT *pS4Ctx,
|
||||||
|
// IN LPCSTR lpszDirID,
|
||||||
|
// IN DWORD dwDirSize,
|
||||||
|
// IN DWORD dwFlags,
|
||||||
|
// IN S4CREATEDIRINFO *pCreateDirInfo
|
||||||
|
// );
|
||||||
|
public long S4CreateDirEx( |
||||||
|
SENSE4_CONTEXT ctx, |
||||||
|
String lpszDirID, |
||||||
|
long dwDirSize, |
||||||
|
long dwFlags, |
||||||
|
S4CREATEDIRINFO pCreateDirInfo |
||||||
|
); |
||||||
|
|
||||||
|
// DWORD WINAPI S4OpenEx(
|
||||||
|
// IN OUT SENSE4_CONTEXT *pS4Ctx,
|
||||||
|
// IN S4OPENINFO *pS4OpenInfo
|
||||||
|
// );
|
||||||
|
|
||||||
|
public long S4OpenEx(SENSE4_CONTEXT ctx, S4OPENINFO pS4OpenInfo); |
||||||
|
} |
@ -0,0 +1,690 @@ |
|||||||
|
/**************************************************************************************
|
||||||
|
* Copyright (c) 2008, Senselock Software Technology Co., Ltd |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* filename: sense4.h |
||||||
|
* |
||||||
|
* briefs: EliteIV library interface declaration, return value and some constant definition. |
||||||
|
* |
||||||
|
* date: 2008.04.08 |
||||||
|
* version: 3.1 |
||||||
|
*******************************************************************************************/ |
||||||
|
|
||||||
|
#ifndef __SENSE4_H__ |
||||||
|
#define __SENSE4_H__ |
||||||
|
|
||||||
|
#ifdef _MSC_VER |
||||||
|
#pragma comment(linker, "/defaultlib:setupapi.lib") |
||||||
|
#endif |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
|
||||||
|
#if defined WIN32 || defined _WIN32 || defined _WIN64 |
||||||
|
#include <windows.h> |
||||||
|
typedef HANDLE S4HANDLE; |
||||||
|
|
||||||
|
#elif defined __MACH__ |
||||||
|
typedef io_connect_t S4HANDLE; |
||||||
|
|
||||||
|
#else |
||||||
|
typedef void* S4HANDLE; |
||||||
|
#endif /* defined WIN32 || defined _WIN32 || defined _WIN64 */ |
||||||
|
|
||||||
|
#ifndef IN |
||||||
|
#define IN |
||||||
|
#endif |
||||||
|
|
||||||
|
#ifndef OUT |
||||||
|
#define OUT |
||||||
|
#endif |
||||||
|
|
||||||
|
#if !defined _WINDOWS_ |
||||||
|
|
||||||
|
#define WINAPI |
||||||
|
|
||||||
|
#define CONST const |
||||||
|
|
||||||
|
typedef unsigned char UCHAR; |
||||||
|
typedef unsigned short USHORT; |
||||||
|
typedef unsigned int UINT; |
||||||
|
typedef unsigned long ULONG; |
||||||
|
|
||||||
|
typedef char CHAR; |
||||||
|
typedef char TCHAR; |
||||||
|
|
||||||
|
typedef void VOID; |
||||||
|
|
||||||
|
#ifndef _BYTE_DEFINED |
||||||
|
#define _BYTE_DEFINED |
||||||
|
typedef unsigned char BYTE; |
||||||
|
#endif |
||||||
|
|
||||||
|
#ifndef _WORD_DEFINED |
||||||
|
#define _WORD_DEFINED |
||||||
|
typedef unsigned short WORD; |
||||||
|
#endif |
||||||
|
|
||||||
|
#ifndef _DWORD_DEFINED |
||||||
|
#define _DWORD_DEFINED |
||||||
|
typedef unsigned long DWORD; |
||||||
|
#endif |
||||||
|
|
||||||
|
typedef VOID* LPVOID; |
||||||
|
typedef CHAR* LPSTR; |
||||||
|
typedef CONST CHAR* LPCSTR; |
||||||
|
typedef CONST TCHAR* LPCTSTR; |
||||||
|
typedef BYTE* LPBYTE; |
||||||
|
typedef WORD* LPWORD; |
||||||
|
typedef DWORD* LPDWORD; |
||||||
|
|
||||||
|
#endif /* !defined _WINDOWS */ |
||||||
|
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
device share mode definition |
||||||
|
*/ |
||||||
|
#define S4_EXCLUSIZE_MODE 0 /** exclusive mode*/ |
||||||
|
#define S4_SHARE_MODE 1 /** sharable mode*/ |
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
the control code value definition |
||||||
|
*/ |
||||||
|
#define S4_LED_UP 0x00000004 /** LED up*/ |
||||||
|
#define S4_LED_DOWN 0x00000008 /** LED down*/ |
||||||
|
#define S4_LED_WINK 0x00000028 /** LED wink*/ |
||||||
|
#define S4_GET_DEVICE_TYPE 0x00000025 /** get the device type*/ |
||||||
|
#define S4_GET_SERIAL_NUMBER 0X00000026 /** get the device serial number*/ |
||||||
|
#define S4_GET_VM_TYPE 0X00000027 /** get the virtual machine type*/ |
||||||
|
#define S4_GET_DEVICE_USABLE_SPACE 0x00000029 /** get the total space of the device*/ |
||||||
|
#define S4_SET_DEVICE_ID 0x0000002a /** set the device ID*/ |
||||||
|
#define S4_RESET_DEVICE 0x00000002 /** reset the device*/ |
||||||
|
#define S4_DF_AVAILABLE_SPACE 0x00000031 /** get the free space of current directory*/ |
||||||
|
#define S4_EF_INFO 0x00000032 /** get specified file information in current directory*/ |
||||||
|
#define S4_SET_USB_MODE 0x00000041 /** set the device as a normal usb device*/ |
||||||
|
#define S4_SET_HID_MODE 0x00000042 /** set the device as a HID device*/ |
||||||
|
#define S4_GET_CUSTOMER_NAME 0x0000002b /** get the customer number*/ |
||||||
|
#define S4_GET_MANUFACTURE_DATE 0x0000002c /** get the manufacture date of the device*/ |
||||||
|
#define S4_GET_CURRENT_TIME 0x0000002d /** get the current time of the clock device*/ |
||||||
|
#define S4_SET_NET_CONFIG 0x00000030 /** set netlock config */ |
||||||
|
//@}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
device type definition |
||||||
|
*/ |
||||||
|
#define S4_LOCAL_DEVICE 0x00 /** local device*/ |
||||||
|
#define S4_MASTER_DEVICE 0x01 /** net master device*/ |
||||||
|
#define S4_SLAVE_DEVICE 0x02 /** net slave device*/ |
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
virtual machine type definition |
||||||
|
*/ |
||||||
|
#define S4_VM_51 0x00 /** inter 51*/ |
||||||
|
#define S4_VM_251_BINARY 0x01 /** inter 251, binary mode*/ |
||||||
|
#define S4_VM_251_SOURCE 0X02 /** inter 251, source mode*/ |
||||||
|
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
NetLock license mode |
||||||
|
*/ |
||||||
|
#define S4_MODULE_MODE 0x00000000 /** Module mode*/ |
||||||
|
#define S4_IP_MODE 0x00000001 /** IP mode*/ |
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
PIN and key type definition |
||||||
|
*/ |
||||||
|
#define S4_USER_PIN 0x000000a1 /** user PIN*/ |
||||||
|
#define S4_DEV_PIN 0x000000a2 /** developer PIN*/ |
||||||
|
#define S4_AUTHEN_PIN 0x000000a3 /** authentication key of net device*/ |
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
file type definition |
||||||
|
*/ |
||||||
|
|
||||||
|
#define S4_RSA_PUBLIC_FILE 0x00000006 /** RSA public key file*/ |
||||||
|
#define S4_RSA_PRIVATE_FILE 0x00000007 /** RSA private key file*/ |
||||||
|
#define S4_EXE_FILE 0x00000008 /** executable file of virtual machine*/ |
||||||
|
#define S4_DATA_FILE 0x00000009 /** data file*/ |
||||||
|
#define S4_XA_EXE_FILE 0x0000000b /** executable file of XA User mode*/ |
||||||
|
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
flag value definition |
||||||
|
*/ |
||||||
|
#define S4_CREATE_NEW 0x000000a5 /** create a new file*/ |
||||||
|
#define S4_UPDATE_FILE 0x000000a6 /** write data to the specified file*/ |
||||||
|
#define S4_KEY_GEN_RSA_FILE 0x000000a7 /** generate RSA key pair files*/ |
||||||
|
#define S4_SET_LICENCES 0x000000a8 /** set the max license number of the current module for the net device*/ |
||||||
|
#define S4_CREATE_ROOT_DIR 0x000000ab /** create root directory*/ |
||||||
|
#define S4_CREATE_SUB_DIR 0x000000ac /** create child directory for current directory*/ |
||||||
|
#define S4_CREATE_MODULE 0x000000ad /** create a module directory for the net device */ |
||||||
|
/** the following three flags can only be used when creating a new executable file */ |
||||||
|
#define S4_FILE_READ_WRITE 0x00000000 /** the new executable file can be read and written by executable file */ |
||||||
|
#define S4_FILE_EXECUTE_ONLY 0x00000100 /** the new executable file can't be read or written by executable file*/ |
||||||
|
#define S4_CREATE_PEDDING_FILE 0x00002000 /** create a padding file*/ |
||||||
|
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
execuable file executing mode definition |
||||||
|
*/ |
||||||
|
#define S4_VM_EXE 0x00000000 /** executing on virtual machine*/ |
||||||
|
#define S4_XA_EXE 0x00000001 /** executing on XA User mode */ |
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
return value definition |
||||||
|
*/ |
||||||
|
|
||||||
|
#define S4_SUCCESS 0x00000000 /** success*/ |
||||||
|
#define S4_UNPOWERED 0x00000001 /** the device has been powered off*/ |
||||||
|
#define S4_INVALID_PARAMETER 0x00000002 /** invalid parameter*/ |
||||||
|
#define S4_COMM_ERROR 0x00000003 /** communication error*/ |
||||||
|
#define S4_PROTOCOL_ERROR 0x00000004 /** communication protocol error*/ |
||||||
|
#define S4_DEVICE_BUSY 0x00000005 /** the device is busy*/ |
||||||
|
#define S4_KEY_REMOVED 0x00000006 /** the device has been removed */ |
||||||
|
#define S4_INSUFFICIENT_BUFFER 0x00000011 /** the input buffer is insufficient*/ |
||||||
|
#define S4_NO_LIST 0x00000012 /** find no device*/ |
||||||
|
#define S4_GENERAL_ERROR 0x00000013 /** general error, commonly indicates not enough memory*/ |
||||||
|
#define S4_UNSUPPORTED 0x00000014 /** the function isn't supported*/ |
||||||
|
#define S4_DEVICE_TYPE_MISMATCH 0x00000020 /** the device type doesn't match*/ |
||||||
|
#define S4_FILE_SIZE_CROSS_7FFF 0x00000021 /** the execuable file crosses address 0x7FFF*/ |
||||||
|
#define S4_CURRENT_DF_ISNOT_MF 0x00000201 /** a net module must be child directory of the root directory*/ |
||||||
|
#define S4_INVAILABLE_MODULE_DF 0x00000202 /** the current directory is not a module*/ |
||||||
|
#define S4_FILE_SIZE_TOO_LARGE 0x00000203 /** the file size is beyond address 0x7FFF*/ |
||||||
|
#define S4_DF_SIZE 0x00000204 /** the specified directory size is too small*/ |
||||||
|
#define S4_DEVICE_UNSUPPORTED 0x00006a81 /** the request can't be supported by the device*/ |
||||||
|
#define S4_FILE_NOT_FOUND 0x00006a82 /** the specified file or directory can't be found */ |
||||||
|
#define S4_INSUFFICIENT_SECU_STATE 0x00006982 /** the security state doesn't match*/ |
||||||
|
#define S4_DIRECTORY_EXIST 0x00006901 /** the specified directory has already existed*/ |
||||||
|
#define S4_FILE_EXIST 0x00006a80 /** the specified file or directory has already existed*/ |
||||||
|
#define S4_INSUFFICIENT_SPACE 0x00006a84 /** the space is insufficient*/ |
||||||
|
#define S4_OFFSET_BEYOND 0x00006B00 /** the offset is beyond the file size*/ |
||||||
|
#define S4_PIN_BLOCK 0x00006983 /** the specified pin or key has been locked*/ |
||||||
|
#define S4_FILE_TYPE_MISMATCH 0x00006981 /** the file type doesn't match*/ |
||||||
|
#define S4_CRYPTO_KEY_NOT_FOUND 0x00009403 /** the specified pin or key cann't be found*/ |
||||||
|
#define S4_APPLICATION_TEMP_BLOCK 0x00006985 /** the directory has been temporarily locked*/ |
||||||
|
#define S4_APPLICATION_PERM_BLOCK 0x00009303 /** the directory has been locked*/ |
||||||
|
#define S4_DATA_BUFFER_LENGTH_ERROR 0x00006700 /** invalid data length*/ |
||||||
|
#define S4_CODE_RANGE 0x00010000 /** the PC register of the virtual machine is out of range*/ |
||||||
|
#define S4_CODE_RESERVED_INST 0x00020000 /** invalid instruction*/ |
||||||
|
#define S4_CODE_RAM_RANGE 0x00040000 /** internal ram address is out of range*/ |
||||||
|
#define S4_CODE_BIT_RANGE 0x00080000 /** bit address is out of range*/ |
||||||
|
#define S4_CODE_SFR_RANGE 0x00100000 /** SFR address is out of range*/ |
||||||
|
#define S4_CODE_XRAM_RANGE 0x00200000 /** external ram address is out of range*/ |
||||||
|
#define S4_ERROR_UNKNOWN 0xffffffff /** unknown error*/ |
||||||
|
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#define MAX_ATR_LEN 56 /** max ATR length */ |
||||||
|
#define MAX_ID_LEN 8 /** max device ID length */ |
||||||
|
#define S4_RSA_MODULUS_LEN 128 /** RSA key modules length,in bytes */ |
||||||
|
#define S4_RSA_PRIME_LEN 64 /** RSA key prime length,in bytes*/ |
||||||
|
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
structure definition |
||||||
|
*/ |
||||||
|
|
||||||
|
/* file information definition*/ |
||||||
|
typedef struct{ |
||||||
|
WORD EfID; /* file ID*/ |
||||||
|
BYTE EfType; /* file type*/ |
||||||
|
WORD EfSize; /* file size*/ |
||||||
|
}EFINFO,*PEFINFO; |
||||||
|
|
||||||
|
|
||||||
|
/* device production date structure definition*/ |
||||||
|
typedef struct { |
||||||
|
WORD wYear; /* year*/ |
||||||
|
BYTE byMonth; /* month*/ |
||||||
|
BYTE byDay; /* the day of the month */ |
||||||
|
}S4_MANUFACTURE_DATE; |
||||||
|
|
||||||
|
/* current time structure definition*/ |
||||||
|
#ifndef _TM_DEFINED |
||||||
|
|
||||||
|
typedef struct { |
||||||
|
int tm_sec; /* seconds after the minute - [0,59] */ |
||||||
|
int tm_min; /* minutes after the hour - [0,59] */ |
||||||
|
int tm_hour; /* hours since midnight - [0,23] */ |
||||||
|
int tm_mday; /* day of the month - [1,31] */ |
||||||
|
int tm_mon; /* months since January - [0,11] */ |
||||||
|
int tm_year; /* years since 1900 */ |
||||||
|
int tm_wday; /* days since Sunday - [0,6] */ |
||||||
|
int tm_yday; /* days since January 1 - [0,365] */ |
||||||
|
int tm_isdst; /* daylight savings time flag */ |
||||||
|
} TM; |
||||||
|
#define _TM_DEFINED |
||||||
|
#endif |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
device version definition |
||||||
|
*/ |
||||||
|
typedef enum{ |
||||||
|
SENSE4_CARD_TYPE_V2_00 = 0x00020000, /** version 2.00*/ |
||||||
|
SENSE4_CARD_TYPE_V2_01 = 0x00020001, /** version 2.10*/ |
||||||
|
SENSE4_CARD_TYPE_V2_02 = 0x00020002, /** version 2.20*/ |
||||||
|
SENSE4_CARD_TYPE_V2_05 = 0x00020005, /** version 2.05*/ |
||||||
|
SENSE4_CARD_TYPE_V2_30 = 0x00020300 /** version 2.30*/ |
||||||
|
}CARD_VERSION; |
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
device information structure definition |
||||||
|
*/ |
||||||
|
typedef struct { |
||||||
|
DWORD dwIndex; /** device index; index begins at zero*/ |
||||||
|
DWORD dwVersion; /** device version*/
|
||||||
|
S4HANDLE hLock; /** device handle*/ |
||||||
|
BYTE reserve[12]; /** reserved*/ |
||||||
|
BYTE bAtr[MAX_ATR_LEN]; /** ATR*/ |
||||||
|
BYTE bID[MAX_ID_LEN]; /** device ID*/ |
||||||
|
DWORD dwAtrLen; /** ATR length*/ |
||||||
|
}SENSE4_CONTEXT,*PSENSE4_CONTEXT; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** RSA public key structure*/ |
||||||
|
typedef struct { |
||||||
|
unsigned char modulus[S4_RSA_MODULUS_LEN]; /* modulus*/ |
||||||
|
unsigned char exponent[S4_RSA_MODULUS_LEN]; /* public exponent*/ |
||||||
|
} S4_RSA_PUBLIC_KEY;
|
||||||
|
|
||||||
|
|
||||||
|
/** RSA private key structure*/
|
||||||
|
typedef struct {
|
||||||
|
unsigned char modulus[S4_RSA_MODULUS_LEN]; /* modulus*/ |
||||||
|
unsigned char publicExponent[S4_RSA_MODULUS_LEN]; /* public exponent*/ |
||||||
|
unsigned char exponent[S4_RSA_MODULUS_LEN]; /* private exponent*/ |
||||||
|
unsigned char prime[2][S4_RSA_PRIME_LEN]; /* prime factors*/ |
||||||
|
unsigned char primeExponent[2][S4_RSA_PRIME_LEN]; /* exponents for CRT*/ |
||||||
|
unsigned char coefficient[S4_RSA_PRIME_LEN]; /* CRT coefficient*/ |
||||||
|
} S4_RSA_PRIVATE_KEY; |
||||||
|
|
||||||
|
/** Netlock Module infomation definition*/ |
||||||
|
typedef struct _S4MODULEINFO { |
||||||
|
WORD wModuleID; /* Module ID*/ |
||||||
|
WORD wLicenseCount; /* License Count */ |
||||||
|
} S4MODULEINFO; |
||||||
|
|
||||||
|
typedef struct _S4NETCONFIG { |
||||||
|
DWORD dwLicenseMode; /* License Mode */ |
||||||
|
DWORD dwModuleCount; /* Module Count */ |
||||||
|
S4MODULEINFO ModuleInfo[16]; /* Module detail infomation */
|
||||||
|
} S4NETCONFIG; |
||||||
|
|
||||||
|
/** S4CREATEDIRINFO structure definition*/ |
||||||
|
typedef struct _S4CREATEDIRINFO { |
||||||
|
DWORD dwS4CreateDirInfoSize; /* size of the structure*/ |
||||||
|
BYTE szAtr[8]; /* ATR information */ |
||||||
|
S4NETCONFIG NetConfig; /* netlock config infomation */ |
||||||
|
} S4CREATEDIRINFO; |
||||||
|
|
||||||
|
/** S4OPENINFO structure definition*/ |
||||||
|
typedef struct _S4OPENINFO { |
||||||
|
DWORD dwS4OpenInfoSize; /* size of the structure*/ |
||||||
|
DWORD dwShareMode; /* share mode*/ |
||||||
|
} S4OPENINFO; |
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
@function interface |
||||||
|
*/ |
||||||
|
|
||||||
|
/*
|
||||||
|
reserved |
||||||
|
*/ |
||||||
|
unsigned long WINAPI S4Startup( |
||||||
|
VOID |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
reserved |
||||||
|
*/ |
||||||
|
unsigned long WINAPI S4Cleanup( |
||||||
|
VOID |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
enumerate all EliteIV devices plugged in the computer. |
||||||
|
if pS4CtxList is NULL, the pdwCtxListSize will return the required buffer size |
||||||
|
|
||||||
|
@paramter pS4CtxList [out] return the device list |
||||||
|
@paramter pdwCtxListSize [in][out] return the amount of storage of device list, in bytes. |
||||||
|
|
||||||
|
@return value
|
||||||
|
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||||
|
|
||||||
|
*/ |
||||||
|
DWORD WINAPI S4Enum( |
||||||
|
OUT SENSE4_CONTEXT *pS4CtxList, |
||||||
|
IN OUT DWORD *pdwCtxListSize |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
open the EliteIV device with sharable mode |
||||||
|
|
||||||
|
@paramter pS4Ctx [in][out] the context pointer of the device |
||||||
|
|
||||||
|
@return value
|
||||||
|
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||||
|
|
||||||
|
*/ |
||||||
|
DWORD WINAPI S4Open( |
||||||
|
IN OUT SENSE4_CONTEXT *pS4Ctx |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
close the EliteIV device |
||||||
|
|
||||||
|
@parameter pS4Ctx [in] the context pointer of the device |
||||||
|
|
||||||
|
|
||||||
|
@return value
|
||||||
|
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||||
|
|
||||||
|
|
||||||
|
*/ |
||||||
|
DWORD WINAPI S4Close( |
||||||
|
IN SENSE4_CONTEXT *pS4Ctx |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Send control command to device |
||||||
|
|
||||||
|
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||||
|
@parameter dwCtlCode [in] control code |
||||||
|
@parameter pInBuffer [in] input buffer |
||||||
|
@parameter dwInBufferLen [in] the length of input data,in bytes |
||||||
|
@parameter pOutBuffer [out] return output data |
||||||
|
@parameter dwOutBufferLen [in] output buffer size, in bytes |
||||||
|
@parameter pdwBytesReturned [out] the length of output data, cannot be NULL |
||||||
|
|
||||||
|
@return value
|
||||||
|
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||||
|
|
||||||
|
*/ |
||||||
|
DWORD WINAPI S4Control( |
||||||
|
IN SENSE4_CONTEXT *pS4Ctx, |
||||||
|
IN DWORD dwCtlCode, |
||||||
|
IN VOID *pInBuffer, |
||||||
|
IN DWORD dwInBufferLen, |
||||||
|
OUT VOID *pOutBuffer, |
||||||
|
IN DWORD dwOutBufferLen, |
||||||
|
OUT DWORD *pdwBytesReturned |
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
create a new child directory for the current directory, and set current directory to the new directory |
||||||
|
|
||||||
|
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||||
|
@parameter lpszDirID [in] ID of the new directory |
||||||
|
@parameter dwDirSize [in] size of the new directory |
||||||
|
@parameter dwFlags [in] flag |
||||||
|
|
||||||
|
@return value
|
||||||
|
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||||
|
|
||||||
|
*/ |
||||||
|
DWORD WINAPI S4CreateDir( |
||||||
|
IN SENSE4_CONTEXT *pS4Ctx, |
||||||
|
IN LPCSTR lpszDirID, |
||||||
|
IN DWORD dwDirSize, |
||||||
|
IN DWORD dwFlags |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
set the current directory |
||||||
|
|
||||||
|
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||||
|
@parameter lpszPath [in] ID of the specified directory |
||||||
|
|
||||||
|
@return value
|
||||||
|
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||||
|
|
||||||
|
*/ |
||||||
|
DWORD WINAPI S4ChangeDir( |
||||||
|
IN SENSE4_CONTEXT *pS4Ctx, |
||||||
|
IN LPCSTR lpszPath |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
erase the root and empty the device if the specified direcotry is the device root, |
||||||
|
otherwise erase all files or child direcotries of the specified directory. |
||||||
|
|
||||||
|
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||||
|
@parameter lpszDirID [in] reserved, must be NULL |
||||||
|
|
||||||
|
@return value
|
||||||
|
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||||
|
|
||||||
|
*/ |
||||||
|
DWORD WINAPI S4EraseDir( |
||||||
|
IN SENSE4_CONTEXT *pS4Ctx, |
||||||
|
IN LPCTSTR lpszDirID |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
verify the pin, to reach a security status before call S4CreateDir,S4EraseDir,S4Execute,S4WriteFile. |
||||||
|
|
||||||
|
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||||
|
@parameter pbPin [in] PIN value |
||||||
|
@parameter dwPinLen [in] the PIN value length, the length of User PIN is 8 bytes,the length of developer PIN is 24 bytes |
||||||
|
@parameter dwPinType [in] PIN type |
||||||
|
|
||||||
|
@return value
|
||||||
|
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||||
|
|
||||||
|
*/ |
||||||
|
DWORD WINAPI S4VerifyPin( |
||||||
|
IN SENSE4_CONTEXT *pS4Ctx, |
||||||
|
IN BYTE *pbPin, |
||||||
|
IN DWORD dwPinLen, |
||||||
|
IN DWORD dwPinType |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
change PIN or key value。 |
||||||
|
|
||||||
|
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||||
|
@parameter pbOldPin [in] old PIN or key value |
||||||
|
@parameter dwOldPinLen [in] the length of old PIN or key value |
||||||
|
@parameter pbNewPin [in] new PIN or key value |
||||||
|
@parameter dwNewPinLen [in] the legnth of new PIN or key value |
||||||
|
@parameter dwPinType [in] PIN or key type |
||||||
|
|
||||||
|
@return value
|
||||||
|
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||||
|
|
||||||
|
*/ |
||||||
|
DWORD WINAPI S4ChangePin( |
||||||
|
IN SENSE4_CONTEXT *pS4Ctx, |
||||||
|
IN BYTE *pbOldPin, |
||||||
|
IN DWORD dwOldPinLen, |
||||||
|
IN BYTE *pbNewPin, |
||||||
|
IN DWORD dwNewPinLen, |
||||||
|
IN DWORD dwPinType |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
create a new file or update file data |
||||||
|
|
||||||
|
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||||
|
@parameter lpszFileID [in] ID of the specified file |
||||||
|
@parameter dwOffset [in] offset to write the file |
||||||
|
@parameter pBuffer [in] input data buffer |
||||||
|
@parameter dwBufferSize [in] input data length |
||||||
|
@parameter dwFileSize [in] file size |
||||||
|
@parameter pdwBytesWritten [out] return the length of data written into the file |
||||||
|
@parameter dwFlags [in] flag |
||||||
|
@parameter bFileType [in] file type |
||||||
|
|
||||||
|
@return value
|
||||||
|
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||||
|
|
||||||
|
*/ |
||||||
|
DWORD WINAPI S4WriteFile( |
||||||
|
IN SENSE4_CONTEXT *pS4Ctx, |
||||||
|
IN LPCSTR lpszFileID, |
||||||
|
IN DWORD dwOffset, |
||||||
|
IN VOID *pBuffer, |
||||||
|
IN DWORD dwBufferSize, |
||||||
|
IN DWORD dwFileSize, |
||||||
|
OUT DWORD *pdwBytesWritten, |
||||||
|
IN DWORD dwFlags, |
||||||
|
IN BYTE bFileType |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
execute the specified executable file of current directory on virtual machine |
||||||
|
|
||||||
|
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||||
|
@parameter lpszFileID [in] ID of the executable file |
||||||
|
@parameter pInBuffer [in] input data buffer |
||||||
|
@parameter dwInbufferSize [in] input data length |
||||||
|
@parameter pOutBuffer [out] output data buffer |
||||||
|
@parameter dwOutBufferSize [in] output data buffer size |
||||||
|
@parameter pdwBytesReturned [out] output data length |
||||||
|
|
||||||
|
@return value
|
||||||
|
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||||
|
*/ |
||||||
|
DWORD WINAPI S4Execute( |
||||||
|
IN SENSE4_CONTEXT *pS4Ctx, |
||||||
|
IN LPCSTR lpszFileID, |
||||||
|
IN VOID *pInBuffer, |
||||||
|
IN DWORD dwInbufferSize, |
||||||
|
OUT VOID *pOutBuffer, |
||||||
|
IN DWORD dwOutBufferSize, |
||||||
|
OUT DWORD *pdwBytesReturned |
||||||
|
); |
||||||
|
|
||||||
|
/**
|
||||||
|
execute the specified executable file of current directory on virtual machine |
||||||
|
or on XA User mode |
||||||
|
|
||||||
|
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||||
|
@parameter lpszFileID [in] ID of the executable file |
||||||
|
@parameter dwFlag [in] executing mode |
||||||
|
@parameter pInBuffer [in] input data buffer |
||||||
|
@parameter dwInbufferSize [in] input data length |
||||||
|
@parameter pOutBuffer [out] output data buffer |
||||||
|
@parameter dwOutBufferSize [in] output data buffer size |
||||||
|
@parameter pdwBytesReturned [out] output data length |
||||||
|
|
||||||
|
@return value
|
||||||
|
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||||
|
|
||||||
|
*/ |
||||||
|
DWORD WINAPI S4ExecuteEx( |
||||||
|
IN SENSE4_CONTEXT *pS4Ctx, |
||||||
|
IN LPCSTR lpszFileID, |
||||||
|
IN DWORD dwFlag, |
||||||
|
IN VOID *pInBuffer, |
||||||
|
IN DWORD dwInbufferSize, |
||||||
|
OUT VOID *pOutBuffer, |
||||||
|
IN DWORD dwOutBufferSize, |
||||||
|
OUT DWORD *pdwBytesReturned |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
create a new child directory for the current directory, and set the new |
||||||
|
directory to current directory. if creating the root directory, the function |
||||||
|
will create a ATR file at the same time. |
||||||
|
|
||||||
|
@parameter pS4Ctx [in] the context pointer of the device, the device must has been opened |
||||||
|
@parameter lpszDirID [in] ID of the new directory |
||||||
|
@parameter dwDirSize [in] size of the new directory |
||||||
|
@parameter dwFlags [in] flag |
||||||
|
@parameter pCreateDirInfo [in] S4CREATEDIRINFO structure pointer |
||||||
|
|
||||||
|
@return value
|
||||||
|
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||||
|
|
||||||
|
*/ |
||||||
|
DWORD WINAPI S4CreateDirEx( |
||||||
|
IN SENSE4_CONTEXT *pS4Ctx, |
||||||
|
IN LPCSTR lpszDirID, |
||||||
|
IN DWORD dwDirSize, |
||||||
|
IN DWORD dwFlags, |
||||||
|
IN S4CREATEDIRINFO *pCreateDirInfo |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
open the EliteIV device using specific mode |
||||||
|
|
||||||
|
@paramter pS4Ctx [in][out] the context pointer of the device |
||||||
|
@paramter pS4OpenInfo [in] S4OPENINFO structure pointer |
||||||
|
|
||||||
|
@return value
|
||||||
|
if the function succeeds,the return vlaue is S4_SUCCESS, otherwise return other defined return value. |
||||||
|
|
||||||
|
*/ |
||||||
|
DWORD WINAPI S4OpenEx( |
||||||
|
IN OUT SENSE4_CONTEXT *pS4Ctx, |
||||||
|
IN S4OPENINFO *pS4OpenInfo |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
#endif //__SENSE4_H__
|
Loading…
Reference in new issue