0001 ### BITPIM 0002 ### 0003 ### Copyright (C) 2003-2005 Joe Pham <djpham@bitpim.org> 0004 ### 0005 ### This program is free software; you can redistribute it and/or modify 0006 ### it under the terms of the BitPim license as detailed in the LICENSE file. 0007 ### 0008 ### $Id: phone_media_codec.py 2369 2005-05-10 05:56:14Z djpham $ 0009 0010 """ 0011 Codec for converting phone media file names to local file names. 0012 """ 0013 0014 # standard modules 0015 import codecs 0016 0017 # wx modules 0018 import wx 0019 0020 # BitPim modules 0021 0022 escape_char='%' 0023 bad_chars={ 0024 '__WXMSW__': (escape_char, '/', '\\', '[', ']', '?', '*', ':', 0025 '"', '<', '>', '|', '=', ';'), 0026 '__WXMAC__': (escape_char, '/', ':'), 0027 '__WXGTK__': (escape_char, '/') } 0028 def phone_media_encode(input, errors='ignore'): 0029 """ Encodes the phone media file name into local storage file name 0030 """ 0031 assert errors=='ignore' 0032 l=[] 0033 for c in input: 0034 ord_c=ord(c) 0035 if ord_c<32 or ord_c>127 or \ 0036 c in bad_chars.get(wx.Platform, ()): 0037 l+=hex(ord_c).replace('0x', escape_char) 0038 else: 0039 l+=c 0040 return (str(''.join(l)), len(input)) 0041 0042 def phone_media_decode(input, errors='ignore'): 0043 """ Decodes local system file name to phone media file name 0044 """ 0045 assert errors=='ignore' 0046 l=[] 0047 esc_str='' 0048 for c in input: 0049 if c==escape_char: 0050 # starting the escape sequence 0051 if len(esc_str): 0052 # current escape sequence is broken, ignore 0053 l+=esc_str 0054 esc_str=c 0055 elif len(esc_str): 0056 # in an esc sequence 0057 esc_str+=c 0058 if len(esc_str)==3: 0059 # got an %xx -> attempt to decode 0060 try: 0061 h=int(esc_str[1:], 16) 0062 l+=chr(h) 0063 except: 0064 # broken esc sequence, ignore 0065 l+=esc_str 0066 esc_str='' 0067 else: 0068 l+=c 0069 return (''.join(l), len(input)) 0070 0071 class Codec(codecs.Codec): 0072 0073 def encode(self, input,errors='strict'): 0074 return phone_media_encode(input,errors) 0075 def decode(self, input,errors='strict'): 0076 return phone_media_decode(input,errors) 0077 0078 class StreamWriter(Codec,codecs.StreamWriter): 0079 pass 0080 0081 class StreamReader(Codec,codecs.StreamReader): 0082 pass 0083 0084 ### encodings module API 0085 codec_name='phone_media' 0086 def search_func(name): 0087 if name==codec_name: 0088 return (phone_media_encode, phone_media_decode, 0089 StreamReader, StreamWriter) 0090
Generated by PyXR 0.9.4