Browse Source
* commit 'c92ae4fa5eefb10831ef5564662647ba4a0c43fb': fenzhi 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打包分支错误. 无JIRA任务,third打包分支错误. 无 REPORT-11624 Excel和Word导出的html解析支持final/10.0.3
neil
6 years ago
35 changed files with 5915 additions and 3074 deletions
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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; |
||||
|
||||
} |
||||
|
||||
} |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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