Avoid too much nesting
This commit is contained in:
parent
cbcd97f6c9
commit
26e91c0b81
|
@ -244,5 +244,14 @@
|
|||
<property name="exceptionVariableName" value="expected"/>
|
||||
</module>
|
||||
<module name="CommentsIndentation"/>
|
||||
<module name="NestedIfDepth">
|
||||
<property name="max" value="4"/>
|
||||
</module>
|
||||
<module name="NestedTryDepth">
|
||||
<property name="max" value="2"/>
|
||||
</module>
|
||||
<module name="NestedForDepth">
|
||||
<property name="max" value="2"/>
|
||||
</module>
|
||||
</module>
|
||||
</module>
|
||||
|
|
|
@ -91,5 +91,14 @@
|
|||
<property name="tokens" value="VARIABLE_DEF"/>
|
||||
<property name="allowSamelineMultipleAnnotations" value="true"/>
|
||||
</module>
|
||||
<module name="NestedIfDepth">
|
||||
<property name="max" value="4"/>
|
||||
</module>
|
||||
<module name="NestedTryDepth">
|
||||
<property name="max" value="2"/>
|
||||
</module>
|
||||
<module name="NestedForDepth">
|
||||
<property name="max" value="2"/>
|
||||
</module>
|
||||
</module>
|
||||
</module>
|
||||
|
|
|
@ -97,11 +97,9 @@ public class NSAtom extends Namespace {
|
|||
type = SyndTypeUtils.getMimeTypeFromUrl(href);
|
||||
}
|
||||
|
||||
if(SyndTypeUtils.enclosureTypeValid(type)) {
|
||||
FeedItem currItem = state.getCurrentItem();
|
||||
if(currItem != null && !currItem.hasMedia()) {
|
||||
currItem.setMedia(new FeedMedia(currItem, href, size, type));
|
||||
}
|
||||
FeedItem currItem = state.getCurrentItem();
|
||||
if (SyndTypeUtils.enclosureTypeValid(type) && currItem != null && !currItem.hasMedia()) {
|
||||
currItem.setMedia(new FeedMedia(currItem, href, size, type));
|
||||
}
|
||||
} else if (LINK_REL_PAYMENT.equals(rel)) {
|
||||
state.getCurrentItem().setPaymentLink(href);
|
||||
|
@ -111,9 +109,9 @@ public class NSAtom extends Namespace {
|
|||
String type = attributes.getValue(LINK_TYPE);
|
||||
/*
|
||||
* Use as link if a) no type-attribute is given and
|
||||
* feed-object has no link yet b) type of link is
|
||||
* LINK_TYPE_HTML or LINK_TYPE_XHTML
|
||||
*/
|
||||
* feed-object has no link yet b) type of link is
|
||||
* LINK_TYPE_HTML or LINK_TYPE_XHTML
|
||||
*/
|
||||
if (state.getFeed() != null &&
|
||||
((type == null && state.getFeed().getLink() == null) ||
|
||||
(LINK_TYPE_HTML.equals(type) || LINK_TYPE_XHTML.equals(type)))) {
|
||||
|
|
|
@ -15,147 +15,142 @@ import de.danoeh.antennapod.core.util.id3reader.model.TagHeader;
|
|||
* create a subclass of it and overwrite the onStart* - or onEnd* - methods.
|
||||
*/
|
||||
public class ID3Reader {
|
||||
private static final int HEADER_LENGTH = 10;
|
||||
private static final int ID3_LENGTH = 3;
|
||||
private static final int FRAME_ID_LENGTH = 4;
|
||||
private static final int HEADER_LENGTH = 10;
|
||||
private static final int ID3_LENGTH = 3;
|
||||
private static final int FRAME_ID_LENGTH = 4;
|
||||
|
||||
private static final int ACTION_SKIP = 1;
|
||||
static final int ACTION_DONT_SKIP = 2;
|
||||
private static final int ACTION_SKIP = 1;
|
||||
static final int ACTION_DONT_SKIP = 2;
|
||||
|
||||
private int readerPosition;
|
||||
private int readerPosition;
|
||||
|
||||
private static final byte ENCODING_UTF16_WITH_BOM = 1;
|
||||
private static final byte ENCODING_UTF16_WITH_BOM = 1;
|
||||
private static final byte ENCODING_UTF16_WITHOUT_BOM = 2;
|
||||
private static final byte ENCODING_UTF8 = 3;
|
||||
|
||||
private TagHeader tagHeader;
|
||||
|
||||
ID3Reader() {
|
||||
}
|
||||
ID3Reader() {
|
||||
}
|
||||
|
||||
public final void readInputStream(InputStream input) throws IOException,
|
||||
ID3ReaderException {
|
||||
int rc;
|
||||
readerPosition = 0;
|
||||
char[] tagHeaderSource = readBytes(input, HEADER_LENGTH);
|
||||
tagHeader = createTagHeader(tagHeaderSource);
|
||||
if (tagHeader == null) {
|
||||
onNoTagHeaderFound();
|
||||
} else {
|
||||
rc = onStartTagHeader(tagHeader);
|
||||
if (rc == ACTION_SKIP) {
|
||||
onEndTag();
|
||||
} else {
|
||||
while (readerPosition < tagHeader.getSize()) {
|
||||
FrameHeader frameHeader = createFrameHeader(readBytes(
|
||||
input, HEADER_LENGTH));
|
||||
if (checkForNullString(frameHeader.getId())) {
|
||||
break;
|
||||
} else {
|
||||
rc = onStartFrameHeader(frameHeader, input);
|
||||
if (rc == ACTION_SKIP) {
|
||||
public final void readInputStream(InputStream input) throws IOException,
|
||||
ID3ReaderException {
|
||||
int rc;
|
||||
readerPosition = 0;
|
||||
char[] tagHeaderSource = readBytes(input, HEADER_LENGTH);
|
||||
tagHeader = createTagHeader(tagHeaderSource);
|
||||
if (tagHeader == null) {
|
||||
onNoTagHeaderFound();
|
||||
} else {
|
||||
rc = onStartTagHeader(tagHeader);
|
||||
if (rc == ACTION_SKIP) {
|
||||
onEndTag();
|
||||
} else {
|
||||
while (readerPosition < tagHeader.getSize()) {
|
||||
FrameHeader frameHeader = createFrameHeader(readBytes(input, HEADER_LENGTH));
|
||||
if (checkForNullString(frameHeader.getId())) {
|
||||
break;
|
||||
}
|
||||
rc = onStartFrameHeader(frameHeader, input);
|
||||
if (rc == ACTION_SKIP) {
|
||||
if (frameHeader.getSize() + readerPosition > tagHeader.getSize()) {
|
||||
break;
|
||||
}
|
||||
skipBytes(input, frameHeader.getSize());
|
||||
}
|
||||
}
|
||||
onEndTag();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (frameHeader.getSize() + readerPosition > tagHeader
|
||||
.getSize()) {
|
||||
break;
|
||||
} else {
|
||||
skipBytes(input, frameHeader.getSize());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
onEndTag();
|
||||
}
|
||||
}
|
||||
}
|
||||
/** Returns true if string only contains null-bytes. */
|
||||
private boolean checkForNullString(String s) {
|
||||
if (!s.isEmpty()) {
|
||||
int i = 0;
|
||||
if (s.charAt(i) == 0) {
|
||||
for (i = 1; i < s.length(); i++) {
|
||||
if (s.charAt(i) != 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Returns true if string only contains null-bytes. */
|
||||
private boolean checkForNullString(String s) {
|
||||
if (!s.isEmpty()) {
|
||||
int i = 0;
|
||||
if (s.charAt(i) == 0) {
|
||||
for (i = 1; i < s.length(); i++) {
|
||||
if (s.charAt(i) != 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a certain number of bytes from the given input stream. This method
|
||||
* changes the readerPosition-attribute.
|
||||
*/
|
||||
/**
|
||||
* Read a certain number of bytes from the given input stream. This method
|
||||
* changes the readerPosition-attribute.
|
||||
*/
|
||||
char[] readBytes(InputStream input, int number)
|
||||
throws IOException, ID3ReaderException {
|
||||
char[] header = new char[number];
|
||||
for (int i = 0; i < number; i++) {
|
||||
int b = input.read();
|
||||
readerPosition++;
|
||||
if (b != -1) {
|
||||
header[i] = (char) b;
|
||||
} else {
|
||||
throw new ID3ReaderException("Unexpected end of stream");
|
||||
}
|
||||
}
|
||||
return header;
|
||||
}
|
||||
throws IOException, ID3ReaderException {
|
||||
char[] header = new char[number];
|
||||
for (int i = 0; i < number; i++) {
|
||||
int b = input.read();
|
||||
readerPosition++;
|
||||
if (b != -1) {
|
||||
header[i] = (char) b;
|
||||
} else {
|
||||
throw new ID3ReaderException("Unexpected end of stream");
|
||||
}
|
||||
}
|
||||
return header;
|
||||
}
|
||||
|
||||
/**
|
||||
* Skip a certain number of bytes on the given input stream. This method
|
||||
* changes the readerPosition-attribute.
|
||||
*/
|
||||
/**
|
||||
* Skip a certain number of bytes on the given input stream. This method
|
||||
* changes the readerPosition-attribute.
|
||||
*/
|
||||
void skipBytes(InputStream input, int number) throws IOException {
|
||||
if (number <= 0) {
|
||||
number = 1;
|
||||
}
|
||||
IOUtils.skipFully(input, number);
|
||||
if (number <= 0) {
|
||||
number = 1;
|
||||
}
|
||||
IOUtils.skipFully(input, number);
|
||||
|
||||
readerPosition += number;
|
||||
}
|
||||
readerPosition += number;
|
||||
}
|
||||
|
||||
private TagHeader createTagHeader(char[] source) throws ID3ReaderException {
|
||||
boolean hasTag = (source[0] == 0x49) && (source[1] == 0x44)
|
||||
&& (source[2] == 0x33);
|
||||
if (source.length != HEADER_LENGTH) {
|
||||
throw new ID3ReaderException("Length of header must be "
|
||||
+ HEADER_LENGTH);
|
||||
}
|
||||
if (hasTag) {
|
||||
String id = new String(source, 0, ID3_LENGTH);
|
||||
char version = (char) ((source[3] << 8) | source[4]);
|
||||
byte flags = (byte) source[5];
|
||||
int size = (source[6] << 24) | (source[7] << 16) | (source[8] << 8)
|
||||
| source[9];
|
||||
private TagHeader createTagHeader(char[] source) throws ID3ReaderException {
|
||||
boolean hasTag = (source[0] == 0x49) && (source[1] == 0x44)
|
||||
&& (source[2] == 0x33);
|
||||
if (source.length != HEADER_LENGTH) {
|
||||
throw new ID3ReaderException("Length of header must be "
|
||||
+ HEADER_LENGTH);
|
||||
}
|
||||
if (hasTag) {
|
||||
String id = new String(source, 0, ID3_LENGTH);
|
||||
char version = (char) ((source[3] << 8) | source[4]);
|
||||
byte flags = (byte) source[5];
|
||||
int size = (source[6] << 24) | (source[7] << 16) | (source[8] << 8)
|
||||
| source[9];
|
||||
size = unsynchsafe(size);
|
||||
return new TagHeader(id, size, version, flags);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return new TagHeader(id, size, version, flags);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private FrameHeader createFrameHeader(char[] source)
|
||||
throws ID3ReaderException {
|
||||
if (source.length != HEADER_LENGTH) {
|
||||
throw new ID3ReaderException("Length of header must be "
|
||||
+ HEADER_LENGTH);
|
||||
}
|
||||
String id = new String(source, 0, FRAME_ID_LENGTH);
|
||||
private FrameHeader createFrameHeader(char[] source)
|
||||
throws ID3ReaderException {
|
||||
if (source.length != HEADER_LENGTH) {
|
||||
throw new ID3ReaderException("Length of header must be "
|
||||
+ HEADER_LENGTH);
|
||||
}
|
||||
String id = new String(source, 0, FRAME_ID_LENGTH);
|
||||
|
||||
int size = (((int) source[4]) << 24) | (((int) source[5]) << 16)
|
||||
| (((int) source[6]) << 8) | source[7];
|
||||
| (((int) source[6]) << 8) | source[7];
|
||||
if (tagHeader != null && tagHeader.getVersion() >= 0x0400) {
|
||||
size = unsynchsafe(size);
|
||||
}
|
||||
char flags = (char) ((source[8] << 8) | source[9]);
|
||||
return new FrameHeader(id, size, flags);
|
||||
}
|
||||
char flags = (char) ((source[8] << 8) | source[9]);
|
||||
return new FrameHeader(id, size, flags);
|
||||
}
|
||||
|
||||
private int unsynchsafe(int in) {
|
||||
int out = 0;
|
||||
|
@ -170,42 +165,42 @@ public class ID3Reader {
|
|||
return out;
|
||||
}
|
||||
|
||||
protected int readString(StringBuilder buffer, InputStream input, int max) throws IOException,
|
||||
ID3ReaderException {
|
||||
if (max > 0) {
|
||||
char[] encoding = readBytes(input, 1);
|
||||
max--;
|
||||
protected int readString(StringBuilder buffer, InputStream input, int max) throws IOException,
|
||||
ID3ReaderException {
|
||||
if (max > 0) {
|
||||
char[] encoding = readBytes(input, 1);
|
||||
max--;
|
||||
|
||||
if (encoding[0] == ENCODING_UTF16_WITH_BOM || encoding[0] == ENCODING_UTF16_WITHOUT_BOM) {
|
||||
if (encoding[0] == ENCODING_UTF16_WITH_BOM || encoding[0] == ENCODING_UTF16_WITHOUT_BOM) {
|
||||
return readUnicodeString(buffer, input, max, Charset.forName("UTF-16")) + 1; // take encoding byte into account
|
||||
} else if (encoding[0] == ENCODING_UTF8) {
|
||||
} else if (encoding[0] == ENCODING_UTF8) {
|
||||
return readUnicodeString(buffer, input, max, Charset.forName("UTF-8")) + 1; // take encoding byte into account
|
||||
} else {
|
||||
return readISOString(buffer, input, max) + 1; // take encoding byte into account
|
||||
}
|
||||
} else {
|
||||
return readISOString(buffer, input, max) + 1; // take encoding byte into account
|
||||
}
|
||||
} else {
|
||||
if (buffer != null) {
|
||||
buffer.append("");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
protected int readISOString(StringBuilder buffer, InputStream input, int max)
|
||||
throws IOException, ID3ReaderException {
|
||||
int bytesRead = 0;
|
||||
char c;
|
||||
while (++bytesRead <= max && (c = (char) input.read()) > 0) {
|
||||
protected int readISOString(StringBuilder buffer, InputStream input, int max)
|
||||
throws IOException, ID3ReaderException {
|
||||
int bytesRead = 0;
|
||||
char c;
|
||||
while (++bytesRead <= max && (c = (char) input.read()) > 0) {
|
||||
if (buffer != null) {
|
||||
buffer.append(c);
|
||||
buffer.append(c);
|
||||
}
|
||||
}
|
||||
return bytesRead;
|
||||
}
|
||||
}
|
||||
return bytesRead;
|
||||
}
|
||||
|
||||
private int readUnicodeString(StringBuilder strBuffer, InputStream input, int max, Charset charset)
|
||||
throws IOException, ID3ReaderException {
|
||||
byte[] buffer = new byte[max];
|
||||
private int readUnicodeString(StringBuilder strBuffer, InputStream input, int max, Charset charset)
|
||||
throws IOException, ID3ReaderException {
|
||||
byte[] buffer = new byte[max];
|
||||
int c;
|
||||
int cZero = -1;
|
||||
int i = 0;
|
||||
|
@ -226,26 +221,26 @@ public class ID3Reader {
|
|||
}
|
||||
}
|
||||
if (strBuffer != null) {
|
||||
strBuffer.append(charset.newDecoder().decode(ByteBuffer.wrap(buffer)).toString());
|
||||
strBuffer.append(charset.newDecoder().decode(ByteBuffer.wrap(buffer)).toString());
|
||||
}
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
int onStartTagHeader(TagHeader header) {
|
||||
return ACTION_SKIP;
|
||||
}
|
||||
int onStartTagHeader(TagHeader header) {
|
||||
return ACTION_SKIP;
|
||||
}
|
||||
|
||||
int onStartFrameHeader(FrameHeader header, InputStream input)
|
||||
throws IOException, ID3ReaderException {
|
||||
return ACTION_SKIP;
|
||||
}
|
||||
int onStartFrameHeader(FrameHeader header, InputStream input)
|
||||
throws IOException, ID3ReaderException {
|
||||
return ACTION_SKIP;
|
||||
}
|
||||
|
||||
void onEndTag() {
|
||||
void onEndTag() {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void onNoTagHeaderFound() {
|
||||
void onNoTagHeaderFound() {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue