#!/usr/bin/env python

'''
Per's SFV is a simple Simple File Verificator that you can use to
verify that a file has not changed.
Copyright (C) 2006  Per Myren <per.myren@gmail.com>
Distributed under the GPL v2

modified by jason moiron to remove wx cruft and to allow file objects 
as arguments to CheckSum()

usage:
    CheckSum(file_or_filename).getfilecrc()
'''


import zlib, md5, struct, binascii, os

class CRC32:
    def __init__(self, s=''):
        self.value = zlib.crc32(s)

    def update(self, s):
        self.value = zlib.crc32(s, self.value)

    def digest(self):
        return struct.pack('>I',self.value)

class CheckSum:
    def __init__(self, filename):
        self.filename = filename

    def _getCheckSum(self, filename, checksumtype):
        try:
            if isinstance(filename, file):
                f = filename
            elif isinstance(filename, str):
                f = file(filename, 'rb')
            while True:
                x = f.read(65536)
                if not x:
                    f.close()
                    return checksumtype.digest()
                checksumtype.update(x)

        except (IOError, OSError):
            return "No such file"

    def getfilemd5(self):
        return binascii.hexlify(self._getCheckSum(self.filename, md5.new()))

    def getfilecrc(self):
        return binascii.hexlify(self._getCheckSum(self.filename, CRC32()))