| 
									
										
										
										
											2002-04-10 21:01:31 +00:00
										 |  |  |  | # Copyright (C) 2001,2002 Python Software Foundation | 
					
						
							| 
									
										
										
										
											2001-09-23 03:17:28 +00:00
										 |  |  |  | # Author: barry@zope.com (Barry Warsaw) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | """Module containing encoding functions for Image.Image and Text.Text.
 | 
					
						
							|  |  |  |  | """
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | import base64 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-04 17:05:11 +00:00
										 |  |  |  |  | 
					
						
							| 
									
										
										
										
											2001-09-23 03:17:28 +00:00
										 |  |  |  | # Helpers | 
					
						
							| 
									
										
										
										
											2002-05-19 23:44:19 +00:00
										 |  |  |  | try: | 
					
						
							|  |  |  |  |     from quopri import encodestring as _encodestring | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     def _qencode(s): | 
					
						
							|  |  |  |  |         enc = _encodestring(s, quotetabs=1) | 
					
						
							|  |  |  |  |         # Must encode spaces, which quopri.encodestring() doesn't do | 
					
						
							|  |  |  |  |         return enc.replace(' ', '=20') | 
					
						
							|  |  |  |  | except ImportError: | 
					
						
							|  |  |  |  |     # Python 2.1 doesn't have quopri.encodestring() | 
					
						
							|  |  |  |  |     from cStringIO import StringIO | 
					
						
							|  |  |  |  |     import quopri as _quopri | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     def _qencode(s): | 
					
						
							|  |  |  |  |         if not s: | 
					
						
							|  |  |  |  |             return s | 
					
						
							|  |  |  |  |         hasnewline = (s[-1] == '\n') | 
					
						
							|  |  |  |  |         infp = StringIO(s) | 
					
						
							|  |  |  |  |         outfp = StringIO() | 
					
						
							|  |  |  |  |         _quopri.encode(infp, outfp, quotetabs=1) | 
					
						
							|  |  |  |  |         # Python 2.x's encode() doesn't encode spaces even when quotetabs==1 | 
					
						
							|  |  |  |  |         value = outfp.getvalue().replace(' ', '=20') | 
					
						
							|  |  |  |  |         if not hasnewline and value[-1] == '\n': | 
					
						
							|  |  |  |  |             return value[:-1] | 
					
						
							|  |  |  |  |         return value | 
					
						
							| 
									
										
										
										
											2001-09-23 03:17:28 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-26 05:26:22 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-23 03:17:28 +00:00
										 |  |  |  | def _bencode(s): | 
					
						
							|  |  |  |  |     # We can't quite use base64.encodestring() since it tacks on a "courtesy | 
					
						
							|  |  |  |  |     # newline".  Blech! | 
					
						
							|  |  |  |  |     if not s: | 
					
						
							|  |  |  |  |         return s | 
					
						
							|  |  |  |  |     hasnewline = (s[-1] == '\n') | 
					
						
							|  |  |  |  |     value = base64.encodestring(s) | 
					
						
							|  |  |  |  |     if not hasnewline and value[-1] == '\n': | 
					
						
							|  |  |  |  |         return value[:-1] | 
					
						
							|  |  |  |  |     return value | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-04 17:05:11 +00:00
										 |  |  |  |  | 
					
						
							| 
									
										
										
										
											2001-09-23 03:17:28 +00:00
										 |  |  |  | def encode_base64(msg): | 
					
						
							|  |  |  |  |     """Encode the message's payload in Base64.
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     Also, add an appropriate Content-Transfer-Encoding: header. | 
					
						
							|  |  |  |  |     """
 | 
					
						
							|  |  |  |  |     orig = msg.get_payload() | 
					
						
							|  |  |  |  |     encdata = _bencode(orig) | 
					
						
							|  |  |  |  |     msg.set_payload(encdata) | 
					
						
							|  |  |  |  |     msg['Content-Transfer-Encoding'] = 'base64' | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-04 17:05:11 +00:00
										 |  |  |  |  | 
					
						
							| 
									
										
										
										
											2001-09-23 03:17:28 +00:00
										 |  |  |  | def encode_quopri(msg): | 
					
						
							|  |  |  |  |     """Encode the message's payload in Quoted-Printable.
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     Also, add an appropriate Content-Transfer-Encoding: header. | 
					
						
							|  |  |  |  |     """
 | 
					
						
							|  |  |  |  |     orig = msg.get_payload() | 
					
						
							|  |  |  |  |     encdata = _qencode(orig) | 
					
						
							|  |  |  |  |     msg.set_payload(encdata) | 
					
						
							|  |  |  |  |     msg['Content-Transfer-Encoding'] = 'quoted-printable' | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-04 17:05:11 +00:00
										 |  |  |  |  | 
					
						
							| 
									
										
										
										
											2001-09-23 03:17:28 +00:00
										 |  |  |  | def encode_7or8bit(msg): | 
					
						
							|  |  |  |  |     """Set the Content-Transfer-Encoding: header to 7bit or 8bit.""" | 
					
						
							|  |  |  |  |     orig = msg.get_payload() | 
					
						
							| 
									
										
										
										
											2002-04-10 21:01:31 +00:00
										 |  |  |  |     if orig is None: | 
					
						
							|  |  |  |  |         # There's no payload.  For backwards compatibility we use 7bit | 
					
						
							|  |  |  |  |         msg['Content-Transfer-Encoding'] = '7bit' | 
					
						
							|  |  |  |  |         return | 
					
						
							| 
									
										
										
										
											2001-09-23 03:17:28 +00:00
										 |  |  |  |     # We play a trick to make this go fast.  If encoding to ASCII succeeds, we | 
					
						
							|  |  |  |  |     # know the data must be 7bit, otherwise treat it as 8bit. | 
					
						
							|  |  |  |  |     try: | 
					
						
							|  |  |  |  |         orig.encode('ascii') | 
					
						
							|  |  |  |  |     except UnicodeError: | 
					
						
							|  |  |  |  |         msg['Content-Transfer-Encoding'] = '8bit' | 
					
						
							|  |  |  |  |     else: | 
					
						
							|  |  |  |  |         msg['Content-Transfer-Encoding'] = '7bit' | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-04 17:05:11 +00:00
										 |  |  |  |  | 
					
						
							| 
									
										
										
										
											2001-09-23 03:17:28 +00:00
										 |  |  |  | def encode_noop(msg): | 
					
						
							|  |  |  |  |     """Do nothing.""" |