mirror of
https://github.com/zxing/zxing.git
synced 2025-02-02 05:41:08 -08:00
First checkin of support for basic NDEF message types -- not enabled yet
git-svn-id: https://zxing.googlecode.com/svn/trunk@286 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
parent
444ec0b00f
commit
4af9453acf
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2008 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.google.zxing.client.result;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Superclass for classes encapsulating results in the NDEF format.
|
||||||
|
* See <a href="http://www.nfc-forum.org/specs/">http://www.nfc-forum.org/specs/</a>.</p>
|
||||||
|
*
|
||||||
|
* <p>This code supports a limited subset of NDEF messages, ones that are plausibly
|
||||||
|
* useful in 2D barcode formats. This generally includes 1-record messages, no chunking,
|
||||||
|
* "short record" syntax, no ID field.</p>
|
||||||
|
*
|
||||||
|
* @author srowen@google.com (Sean Owen)
|
||||||
|
*/
|
||||||
|
abstract class AbstractNDEFParsedResult extends ParsedReaderResult {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MB = 1 (start of record)
|
||||||
|
* ME = 1 (also end of record)
|
||||||
|
* CF = 0 (not a chunk)
|
||||||
|
* SR = 1 (assume short record)
|
||||||
|
* ID = 0 (ID length field omitted)
|
||||||
|
* TNF = 0 (= 1, well-known type)
|
||||||
|
* 0
|
||||||
|
* 1
|
||||||
|
*/
|
||||||
|
private static final int HEADER_VALUE = 0xD1;
|
||||||
|
private static final int MASK = 0xFF;
|
||||||
|
|
||||||
|
AbstractNDEFParsedResult(ParsedReaderResultType type) {
|
||||||
|
super(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isMaybeNDEF(byte[] bytes) {
|
||||||
|
return
|
||||||
|
bytes != null &&
|
||||||
|
bytes.length >= 4 &&
|
||||||
|
((bytes[0] & MASK) == HEADER_VALUE) &&
|
||||||
|
((bytes[1] & 0xFF) == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static String bytesToString(byte[] bytes, int offset, int length, String encoding) {
|
||||||
|
try {
|
||||||
|
return new String(bytes, offset, length, encoding);
|
||||||
|
} catch (UnsupportedEncodingException uee) {
|
||||||
|
throw new RuntimeException("Platform does not support required encoding: " + uee);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2008 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.google.zxing.client.result;
|
||||||
|
|
||||||
|
import com.google.zxing.Result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recognizes an NDEF message that encodes text according to the
|
||||||
|
* "Text Record Type Definition" specification.
|
||||||
|
*
|
||||||
|
* @author srowen@google.com (Sean Owen)
|
||||||
|
*/
|
||||||
|
public final class NDEFTextParsedResult extends AbstractNDEFParsedResult {
|
||||||
|
|
||||||
|
private static final byte TEXT_WELL_KNOWN_TYPE = (byte) 0x54;
|
||||||
|
|
||||||
|
private final String language;
|
||||||
|
private final String text;
|
||||||
|
|
||||||
|
private NDEFTextParsedResult(String language, String text) {
|
||||||
|
super(ParsedReaderResultType.NDEF_TEXT);
|
||||||
|
this.language = language;
|
||||||
|
this.text = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NDEFTextParsedResult parse(Result result) {
|
||||||
|
byte[] bytes = result.getRawBytes();
|
||||||
|
if (!isMaybeNDEF(bytes)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
int payloadLength = bytes[2] & 0xFF;
|
||||||
|
|
||||||
|
// Next 1 byte is type
|
||||||
|
if (bytes[3] != TEXT_WELL_KNOWN_TYPE) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Text record
|
||||||
|
byte statusByte = bytes[4];
|
||||||
|
boolean isUTF16 = (statusByte & 0x80) != 0;
|
||||||
|
int languageLength = statusByte & 0x1F;
|
||||||
|
|
||||||
|
// language is always ASCII-encoded:
|
||||||
|
String language = bytesToString(bytes, 5, languageLength, "US-ASCII");
|
||||||
|
String encoding = isUTF16 ? "UTF-16" : "UTF-8";
|
||||||
|
String text = bytesToString(bytes, 5 + languageLength, payloadLength - languageLength - 1, encoding);
|
||||||
|
return new NDEFTextParsedResult(language, text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLanguage() {
|
||||||
|
return language;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getText() {
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDisplayResult() {
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
109
core/src/com/google/zxing/client/result/NDEFURIParsedResult.java
Normal file
109
core/src/com/google/zxing/client/result/NDEFURIParsedResult.java
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2008 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.google.zxing.client.result;
|
||||||
|
|
||||||
|
import com.google.zxing.Result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recognizes an NDEF message that encodes a URI according to the
|
||||||
|
* "URI Record Type Definition" specification.
|
||||||
|
*
|
||||||
|
* @author srowen@google.com (Sean Owen)
|
||||||
|
*/
|
||||||
|
public final class NDEFURIParsedResult extends AbstractNDEFParsedResult {
|
||||||
|
|
||||||
|
private static final byte URI_WELL_KNOWN_TYPE = (byte) 0x55;
|
||||||
|
|
||||||
|
private static final String[] URI_PREFIXES = new String[] {
|
||||||
|
null,
|
||||||
|
"http://www.",
|
||||||
|
"https://www.",
|
||||||
|
"http://",
|
||||||
|
"https://",
|
||||||
|
"tel:",
|
||||||
|
"mailto:",
|
||||||
|
"ftp://anonymous:anonymous@",
|
||||||
|
"ftp://ftp.",
|
||||||
|
"ftps://",
|
||||||
|
"sftp://",
|
||||||
|
"smb://",
|
||||||
|
"nfs://",
|
||||||
|
"ftp://",
|
||||||
|
"dav://",
|
||||||
|
"news:",
|
||||||
|
"telnet://",
|
||||||
|
"imap:",
|
||||||
|
"rtsp://",
|
||||||
|
"urn:",
|
||||||
|
"pop:",
|
||||||
|
"sip:",
|
||||||
|
"sips:",
|
||||||
|
"tftp:",
|
||||||
|
"btspp://",
|
||||||
|
"btl2cap://",
|
||||||
|
"btgoep://",
|
||||||
|
"tcpobex://",
|
||||||
|
"irdaobex://",
|
||||||
|
"file://",
|
||||||
|
"urn:epc:id:",
|
||||||
|
"urn:epc:tag:",
|
||||||
|
"urn:epc:pat:",
|
||||||
|
"urn:epc:raw:",
|
||||||
|
"urn:epc:",
|
||||||
|
"urn:nfc:",
|
||||||
|
};
|
||||||
|
|
||||||
|
private final String uri;
|
||||||
|
|
||||||
|
private NDEFURIParsedResult(String uri) {
|
||||||
|
super(ParsedReaderResultType.NDEF_TEXT);
|
||||||
|
this.uri = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NDEFURIParsedResult parse(Result result) {
|
||||||
|
byte[] bytes = result.getRawBytes();
|
||||||
|
if (!isMaybeNDEF(bytes)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
int payloadLength = bytes[2] & 0xFF;
|
||||||
|
|
||||||
|
// Next 1 byte is type
|
||||||
|
if (bytes[3] != URI_WELL_KNOWN_TYPE) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
int identifierCode = bytes[4] & 0xFF;
|
||||||
|
String prefix = null;
|
||||||
|
if (identifierCode < URI_PREFIXES.length) {
|
||||||
|
prefix = URI_PREFIXES[identifierCode];
|
||||||
|
}
|
||||||
|
|
||||||
|
String restOfURI = bytesToString(bytes, 5, payloadLength - 1, "UTF-8");
|
||||||
|
String fullURI = prefix == null ? restOfURI : prefix + restOfURI;
|
||||||
|
return new NDEFURIParsedResult(fullURI);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getURI() {
|
||||||
|
return uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDisplayResult() {
|
||||||
|
return uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -35,6 +35,9 @@ public final class ParsedReaderResultType {
|
||||||
public static final ParsedReaderResultType TEXT = new ParsedReaderResultType("TEXT");
|
public static final ParsedReaderResultType TEXT = new ParsedReaderResultType("TEXT");
|
||||||
public static final ParsedReaderResultType ANDROID_INTENT = new ParsedReaderResultType("ANDROID_INTENT");
|
public static final ParsedReaderResultType ANDROID_INTENT = new ParsedReaderResultType("ANDROID_INTENT");
|
||||||
public static final ParsedReaderResultType GEO = new ParsedReaderResultType("GEO");
|
public static final ParsedReaderResultType GEO = new ParsedReaderResultType("GEO");
|
||||||
|
// TODO later, add the NDEF types to those actually processed by the clients
|
||||||
|
public static final ParsedReaderResultType NDEF_TEXT = new ParsedReaderResultType("NDEF_TEXT");
|
||||||
|
public static final ParsedReaderResultType NDEF_URI = new ParsedReaderResultType("NDEF_URI");
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue