diff options
author | Nils Schwabe | 2014-07-04 13:02:57 +0200 |
---|---|---|
committer | Nils Schwabe | 2014-07-04 13:02:57 +0200 |
commit | 2037cb1a089787adeb3b3c7d83d5d0f1e1502aa0 (patch) | |
tree | f36e69141188bbcb365b038b3faa2d50441b3427 /src/main/java/org/openslx/imagemaster/crcchecker/CRCFile.java | |
parent | Added TODOs (diff) | |
download | master-sync-shared-2037cb1a089787adeb3b3c7d83d5d0f1e1502aa0.tar.gz master-sync-shared-2037cb1a089787adeb3b3c7d83d5d0f1e1502aa0.tar.xz master-sync-shared-2037cb1a089787adeb3b3c7d83d5d0f1e1502aa0.zip |
Move crc checler from masterserver to master-sync-shared
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/crcchecker/CRCFile.java')
-rw-r--r-- | src/main/java/org/openslx/imagemaster/crcchecker/CRCFile.java | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/main/java/org/openslx/imagemaster/crcchecker/CRCFile.java b/src/main/java/org/openslx/imagemaster/crcchecker/CRCFile.java new file mode 100644 index 0000000..b557ada --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/crcchecker/CRCFile.java @@ -0,0 +1,72 @@ +package org.openslx.imagemaster.crcchecker; + +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.CRC32; + +/** + * Represents a crcfile + * @author nils + * + */ +public class CRCFile +{ + private File file; + private List<Integer> crcSums = null; + + CRCFile(String filename) { + this.file = new File( filename ); + } + + /** + * Checks if this crc file is valid. + * (If the crc over the file is equal to the first crc sum.) + * @return Whether the crc file is valid + * @throws IOException If the file could not be read or could not be found + */ + public boolean isValid() throws IOException { + FileInputStream fis = new FileInputStream( file ); + DataInputStream dis = new DataInputStream( fis ); + + int crcSum = dis.readInt(); + + CRC32 crcCalc = new CRC32(); + + byte[] bytes = new byte[(int) file.length() - Integer.SIZE/8]; // byte array with length of the file minus the first crc sum (=4byte) + fis.read( bytes ); + crcCalc.update( bytes ); + + dis.close(); + + if (crcSum == Integer.reverseBytes( (int) crcCalc.getValue() ) ) return true; + else return false; + } + + /** + * Get a specified crcSum for a block number + * @param blockNumber + * @return The crcSum or 0 if the block number is invalid + * @throws IOException + */ + public int getCRCSum(int blockNumber) throws IOException { + if (crcSums == null) { + // the crcSums were not read yet + DataInputStream dis = new DataInputStream( new FileInputStream( file ) ); + crcSums = new ArrayList<>(); + for (int i = 0; i < file.length()/4; i++) { + int s = dis.readInt(); + if (i > 0) crcSums.add( s ); // skip the first crcSum because it's the sum over the crcFile + } + dis.close(); + } + + if (blockNumber < 0) return 0; + if (blockNumber > crcSums.size() - 1) return 0; + + return crcSums.get( blockNumber ); + } +} |