1 | package org.farng.mp3.id3; |
2 | |
3 | import org.farng.mp3.AbstractMP3FragmentBody; |
4 | import org.farng.mp3.InvalidTagException; |
5 | |
6 | import java.io.IOException; |
7 | import java.io.RandomAccessFile; |
8 | |
9 | /** |
10 | * Each ID3v2 frame contains a header and then the payload. This is the super class for the payload |
11 | * |
12 | * @author Eric Farng |
13 | * @version $Revision: 1.4 $ |
14 | */ |
15 | public abstract class AbstractID3v2FrameBody extends AbstractMP3FragmentBody { |
16 | |
17 | /** |
18 | * Creates a new AbstractID3v2FrameBody object. |
19 | */ |
20 | protected AbstractID3v2FrameBody() { |
21 | super(); |
22 | } |
23 | |
24 | /** |
25 | * Creates a new AbstractID3v2FrameBody object. |
26 | */ |
27 | protected AbstractID3v2FrameBody(final AbstractID3v2FrameBody copyObject) { |
28 | super(copyObject); |
29 | } |
30 | |
31 | public boolean equals(final Object obj) { |
32 | return obj instanceof AbstractID3v2FrameBody && super.equals(obj); |
33 | } |
34 | |
35 | protected int readHeader(final RandomAccessFile file) throws IOException, InvalidTagException { |
36 | final int size; |
37 | final byte[] buffer = new byte[3]; |
38 | if (has6ByteHeader()) { |
39 | // read the 3 byte size |
40 | file.read(buffer, 0, 3); |
41 | size = (int) (buffer[0] * Math.pow(2, 16) + buffer[1] * Math.pow(2, 8) + buffer[2]); |
42 | } else { |
43 | // read the 4 byte size |
44 | size = file.readInt(); |
45 | |
46 | // we need to skip the flag bytes; |
47 | file.skipBytes(2); |
48 | } |
49 | if (size == 0) { |
50 | throw new InvalidTagException("Found empty frame"); |
51 | } |
52 | if (size <= 0 || size > file.length()) { |
53 | throw new InvalidTagException("Invalid size for Frame Body"); |
54 | } |
55 | return size; |
56 | } |
57 | |
58 | protected void writeHeader(final RandomAccessFile file, final int size) throws IOException { |
59 | final byte[] buffer = new byte[3]; |
60 | if (has6ByteHeader()) { |
61 | // write the 3 byte size; |
62 | buffer[0] = (byte) ((size & 0x00FF0000) >> 16); |
63 | buffer[1] = (byte) ((size & 0x0000FF00) >> 8); |
64 | buffer[2] = (byte) (size & 0x000000FF); |
65 | file.write(buffer); |
66 | } else { |
67 | // write the 4 byte size; |
68 | file.writeInt(size); |
69 | |
70 | // need to skip 2 flag bytes |
71 | file.skipBytes(2); |
72 | } |
73 | } |
74 | } |