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; |
||||
|
||||
} |
||||
|
||||
} |
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