1*cda5da8dSAndroid Build Coastguard Worker"""Codec for quoted-printable encoding. 2*cda5da8dSAndroid Build Coastguard Worker 3*cda5da8dSAndroid Build Coastguard WorkerThis codec de/encodes from bytes to bytes. 4*cda5da8dSAndroid Build Coastguard Worker""" 5*cda5da8dSAndroid Build Coastguard Worker 6*cda5da8dSAndroid Build Coastguard Workerimport codecs 7*cda5da8dSAndroid Build Coastguard Workerimport quopri 8*cda5da8dSAndroid Build Coastguard Workerfrom io import BytesIO 9*cda5da8dSAndroid Build Coastguard Worker 10*cda5da8dSAndroid Build Coastguard Workerdef quopri_encode(input, errors='strict'): 11*cda5da8dSAndroid Build Coastguard Worker assert errors == 'strict' 12*cda5da8dSAndroid Build Coastguard Worker f = BytesIO(input) 13*cda5da8dSAndroid Build Coastguard Worker g = BytesIO() 14*cda5da8dSAndroid Build Coastguard Worker quopri.encode(f, g, quotetabs=True) 15*cda5da8dSAndroid Build Coastguard Worker return (g.getvalue(), len(input)) 16*cda5da8dSAndroid Build Coastguard Worker 17*cda5da8dSAndroid Build Coastguard Workerdef quopri_decode(input, errors='strict'): 18*cda5da8dSAndroid Build Coastguard Worker assert errors == 'strict' 19*cda5da8dSAndroid Build Coastguard Worker f = BytesIO(input) 20*cda5da8dSAndroid Build Coastguard Worker g = BytesIO() 21*cda5da8dSAndroid Build Coastguard Worker quopri.decode(f, g) 22*cda5da8dSAndroid Build Coastguard Worker return (g.getvalue(), len(input)) 23*cda5da8dSAndroid Build Coastguard Worker 24*cda5da8dSAndroid Build Coastguard Workerclass Codec(codecs.Codec): 25*cda5da8dSAndroid Build Coastguard Worker def encode(self, input, errors='strict'): 26*cda5da8dSAndroid Build Coastguard Worker return quopri_encode(input, errors) 27*cda5da8dSAndroid Build Coastguard Worker def decode(self, input, errors='strict'): 28*cda5da8dSAndroid Build Coastguard Worker return quopri_decode(input, errors) 29*cda5da8dSAndroid Build Coastguard Worker 30*cda5da8dSAndroid Build Coastguard Workerclass IncrementalEncoder(codecs.IncrementalEncoder): 31*cda5da8dSAndroid Build Coastguard Worker def encode(self, input, final=False): 32*cda5da8dSAndroid Build Coastguard Worker return quopri_encode(input, self.errors)[0] 33*cda5da8dSAndroid Build Coastguard Worker 34*cda5da8dSAndroid Build Coastguard Workerclass IncrementalDecoder(codecs.IncrementalDecoder): 35*cda5da8dSAndroid Build Coastguard Worker def decode(self, input, final=False): 36*cda5da8dSAndroid Build Coastguard Worker return quopri_decode(input, self.errors)[0] 37*cda5da8dSAndroid Build Coastguard Worker 38*cda5da8dSAndroid Build Coastguard Workerclass StreamWriter(Codec, codecs.StreamWriter): 39*cda5da8dSAndroid Build Coastguard Worker charbuffertype = bytes 40*cda5da8dSAndroid Build Coastguard Worker 41*cda5da8dSAndroid Build Coastguard Workerclass StreamReader(Codec, codecs.StreamReader): 42*cda5da8dSAndroid Build Coastguard Worker charbuffertype = bytes 43*cda5da8dSAndroid Build Coastguard Worker 44*cda5da8dSAndroid Build Coastguard Worker# encodings module API 45*cda5da8dSAndroid Build Coastguard Worker 46*cda5da8dSAndroid Build Coastguard Workerdef getregentry(): 47*cda5da8dSAndroid Build Coastguard Worker return codecs.CodecInfo( 48*cda5da8dSAndroid Build Coastguard Worker name='quopri', 49*cda5da8dSAndroid Build Coastguard Worker encode=quopri_encode, 50*cda5da8dSAndroid Build Coastguard Worker decode=quopri_decode, 51*cda5da8dSAndroid Build Coastguard Worker incrementalencoder=IncrementalEncoder, 52*cda5da8dSAndroid Build Coastguard Worker incrementaldecoder=IncrementalDecoder, 53*cda5da8dSAndroid Build Coastguard Worker streamwriter=StreamWriter, 54*cda5da8dSAndroid Build Coastguard Worker streamreader=StreamReader, 55*cda5da8dSAndroid Build Coastguard Worker _is_text_encoding=False, 56*cda5da8dSAndroid Build Coastguard Worker ) 57