package net.pms.dlna; import net.pms.Messages; import net.pms.PMS; import net.pms.dlna.virtual.VirtualFolder; import net.pms.dlna.virtual.VirtualVideoAction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CodeEnter extends VirtualFolder { @SuppressWarnings("unused") private static final Logger LOGGER = LoggerFactory.getLogger(CodeEnter.class); private DLNAResource resource; private String enteredCode; private String code; private long changed; private long commitTime; public static final int DIGITS = 0; public static final int LETTERS = 1; public static final int BOTH = 2; private abstract class CodeAction extends VirtualVideoAction { public CodeAction(String name, boolean enable) { super(name, enable); } @Override public boolean quietPlay() { return true; } } public CodeEnter(DLNAResource r) { super(r.getName(), r.getThumbnailURL(DLNAImageProfile.JPEG_TN)); resource = r; code = ""; enteredCode = ""; changed = 0; commitTime = 0; } private boolean preventAutoPlay() { // Normally changed is 0 and 0+15000 is never larger // then now. int tmo; if (getDefaultRenderer() != null) { tmo = getDefaultRenderer().getAutoPlayTmo(); } else { tmo = 5000; } return (changed + tmo) > System.currentTimeMillis(); } public void setCode(String str) { code = str; } public void setEnteredCode(String str) { enteredCode = str; } public String getCode() { return code; } public DLNAResource getResource() { return resource; } private void addCharVVA(final String ch) { super.addChild(new CodeAction(ch, true) { @Override public boolean enable() { if (preventAutoPlay()) { return false; } enteredCode += ch; changed = System.currentTimeMillis(); return true; } }); } @Override public void discoverChildren(String str) { discoverChildren(); } @Override public void discoverChildren() { super.addChild(resource); int charset = configuration.getCodeCharSet(); if (charset == LETTERS || charset == BOTH) { // Letters first for (char i = 'A'; i <= 'Z'; i++) { addCharVVA(String.valueOf(i)); } } if (charset == DIGITS || charset == BOTH) { // then the digits for (int i = 0; i < 10; i++) { addCharVVA(String.valueOf(i)); } } super.addChild(new CodeAction(Messages.getString("TracesTab.3"), true) { @Override public boolean enable() { if (preventAutoPlay()) { return false; } setEnteredCode(""); changed = System.currentTimeMillis(); return true; } }); } @Override public void doRefreshChildren() { doRefreshChildren(null); } @Override public void doRefreshChildren(String str) { setEnteredCode(""); getChildren().clear(); discoverChildren(str); analyzeChildren(-1); } public boolean validCode(DLNAResource r) { if (r != null && r instanceof CodeAction) { // always ok return true; } String realCode = PMS.get().codeDb().lookup(code); //LOGGER.debug("valid code " + realCode + " " + enteredCode); if (!enteredCode.equalsIgnoreCase(realCode)) { // bad code return false; } if (commitTime == 0) { // 1st commit commitTime = System.currentTimeMillis(); return true; } boolean res = (System.currentTimeMillis() - commitTime) < configuration.getCodeValidTmo(); if (!res) { // clear entered code setEnteredCode(""); commitTime = 0; setDiscovered(false); getChildren().clear(); } return res; } @Override public String toString() { return "CODE " + code; } }