PyXR

c:\projects\bitpim\src \ phone_media_codec.py



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