class GPGEncryption():

    def __init__(self, encrypt_or_decrypt, iterable = None, user = None, passphrase = None, test_branch = False):
        self.test_branch = test_branch
        cmd = 'gpg -a -r ' + user + ' -e'
        #cmd = 'cat'
        self.total_sent = 0
        self.term_char = chr(0)
        self.chunk_size = CHUNK_SIZE
        self.stream_iter = iterable
        self.stream_iter_read = iterable.read
        self.gpg_closed = False
        self.padded = False
        self.finished_read = False
        self.first_read = True
        #shared variable between threads
        self.finished_write = False
        self.p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds = True, bufsize = CHUNK_SIZE)

        self.my_buffer = ''
        self.finished_write = False
        self.finished_read = False
        self.semaphore = threading.Semaphore()


    def print_errors(self):
        print self.p.readerr()

    def stringIterate(self, text, chunk_size):
        index = 0

        while index < len(text):
            yield text[index : index + chunk_size]
            index += chunk_size

    def padder(self, text, div, pad = chr(0)):
            size = (div - len(text) % div) + len(text)
            diff = size - len(text)
            text += pad * diff
            return text

    def readFromStream(self, read_size):
        chunk = self.stream_iter_read(read_size)
        while chunk:
            self.p.stdin.write(chunk)
            chunk = self.stream_iter_read(read_size)
        self.p.stdin.close()

    def read(self, read_size):
        read_size = self.chunk_size
        if self.first_read:
            self.first_read = False
            t = Thread(target = self.readFromStream, args = (read_size, ))
            t.start()
        chunk = self.p.stdout.read(read_size)
        if chunk and len(chunk) < read_size:
            chunk = self.padder(chunk, read_size)
        self.total_sent += len(chunk)
        #print 'returning chunk = ' + str(len(chunk))
        return chunk