diff options
author | Nils Schwabe | 2014-07-29 15:55:52 +0200 |
---|---|---|
committer | Nils Schwabe | 2014-07-29 15:55:52 +0200 |
commit | 6ea561385a291bb78077c368b1df5f997e11d80e (patch) | |
tree | a961358dea1ba3f45cd0fdd8e956910ada8a2a53 /src/main/java/org/openslx/imagemaster/crcchecker/CrcFile.java | |
parent | Change type of range to long so that files larger than 2 GiB are supported (diff) | |
download | master-sync-shared-6ea561385a291bb78077c368b1df5f997e11d80e.tar.gz master-sync-shared-6ea561385a291bb78077c368b1df5f997e11d80e.tar.xz master-sync-shared-6ea561385a291bb78077c368b1df5f997e11d80e.zip |
Rename classes and methods to fit camelCase
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/crcchecker/CrcFile.java')
-rw-r--r-- | src/main/java/org/openslx/imagemaster/crcchecker/CrcFile.java | 172 |
1 files changed, 172 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..542234b --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/crcchecker/CrcFile.java @@ -0,0 +1,172 @@ +package org.openslx.imagemaster.crcchecker; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.CRC32; + +/** + * Represents a crc file + */ +public class CrcFile +{ + private File file = null; + private List<Integer> crcSums = null; + private Boolean valid = null; + + /** + * Loads a crcFile from file + * + * @param filename + */ + public CrcFile( String filename ) + { + this.file = new File( filename ); + } + + /** + * Creates a crc file which is not on the drive. + * + * @param crcSums + */ + public CrcFile( List<Integer> crcSums ) + { + this.crcSums = crcSums; + } + + /** + * Creates a new crc file with the given sums. + * The first crc sum in the list needs to be the sum over the other sums. + * Deletes existing files with the same name. + * + * @param listOfCrcSums The list of the crc sums that are going into the crc file + * @param filename Where to save the created crc file + * @throws IOException If it's not possible to write the file + */ + public static CrcFile writeCrcFile( List<Integer> listOfCrcSums, String filename ) throws IOException + { + File file = new File( filename ); + + if ( file.exists() ) + file.delete(); + + FileOutputStream fos = new FileOutputStream( file ); + DataOutputStream dos = new DataOutputStream( fos ); + + for ( Integer sum : listOfCrcSums ) { + dos.writeInt( sum.intValue() ); + } + + dos.close(); + return new CrcFile( filename ); + } + + /** + * Checks if given sums are valid. + * + * @param listOfCrcSums + * @return + */ + public static boolean sumsAreValid( List<Integer> listOfCrcSums ) + { + if ( listOfCrcSums == null || listOfCrcSums.isEmpty() ) + return false; + + int masterSum = listOfCrcSums.get( 0 ); // don't use the first sum for the calculation because it is the sum over the other sums + int size = listOfCrcSums.size(); + + CRC32 crcCalc = new CRC32(); + + for ( int i = 1; i < size; i++ ) { + crcCalc.update( ByteBuffer.allocate( 4 ).putInt( listOfCrcSums.get( i ) ).array() ); // update the crc calculator with the next 4 bytes of the integer + } + + return ( masterSum == Integer.reverseBytes( (int)crcCalc.getValue() ) ); + } + + /** + * 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 + { + if ( valid == null ) { + if ( file == null ) { + valid = sumsAreValid( this.crcSums ); + } else { + if ( crcSums == null ) + loadSums(); + valid = sumsAreValid( this.crcSums ); + } + } + return valid; + } + + /** + * Get a specified crcSum for a block number + * + * @param blockNumber + * @return The crcSum or 0 if the block number is invalid + * @throws IOException If the crcSums could not be loaded from file + */ + public int getCRCSum( int blockNumber ) throws IOException + { + if ( crcSums == null ) + loadSums(); + if ( crcSums.size() == 0 ) + return 0; + + if ( blockNumber < 0 ) + return 0; + if ( blockNumber > crcSums.size() - 2 ) + return 0; + + return crcSums.get( blockNumber + 1 ); + } + + /** + * Returns the loaded crcSums. + * + * @return The loaded crcSums + * @throws IOException If the crcSums could not be loaded from file + */ + public List<Integer> getCrcSums() throws IOException + { + if ( crcSums == null ) + loadSums(); + if ( crcSums.size() == 0 ) + return new ArrayList<>(); + return this.crcSums; + } + + private void loadSums() throws IOException + { + if ( crcSums != null ) + return; + // 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++ ) { + crcSums.add( dis.readInt() ); + } + dis.close(); + } + + public int getMasterSum() throws IOException + { + if ( crcSums == null ) + loadSums(); + if ( crcSums.size() == 0 ) + return 0; + return this.crcSums.get( 0 ); + } +} |