0001 ### BITPIM 0002 ### 0003 ### Copyright (C) 2007 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: com_motov3mm.py 4541 2008-01-04 03:41:51Z djpham $ 0009 0010 """Communicate with Motorola phones using AT commands""" 0011 import time 0012 0013 import common 0014 import com_motov710m as v710m 0015 import com_motov3m as v3m 0016 import prototypes 0017 import p_motov3m 0018 import helpids 0019 0020 parentphone=v710m.Phone 0021 class Phone(parentphone): 0022 """ Talk to a Motorola V3mM phone""" 0023 desc='Moto-V3mM' 0024 helpid=helpids.ID_PHONE_MOTOV3MM 0025 protocolclass=p_motov3m 0026 serialsname='motov3mm' 0027 MODEOBEX='modeobex' 0028 0029 builtinringtones=( 0030 (0, ('Silent',)), 0031 (5, ('Vibe Dot', 'Vibe Dash', 'Vibe Dot Dot', 'Vibe Dot Dash', 0032 'Vibe Pulse')), 0033 ) 0034 0035 def __init__(self, logtarget, commport): 0036 parentphone.__init__(self, logtarget, commport) 0037 self.obex=None 0038 0039 def _get_wallpaper_index(self): 0040 res={} 0041 _files=self.listfiles(self.protocolclass.WP_PATH).keys() 0042 _files.sort() 0043 for _index,_filename in enumerate(_files): 0044 _name=common.basename(_filename) 0045 if self.protocolclass.valid_wp_filename(_name): 0046 res[_index]={ 'name': _name, 0047 'filename': _filename, 0048 'origin': 'images' } 0049 return res 0050 0051 def _get_ringtone_index(self): 0052 res={} 0053 # first the builtin ones 0054 for _l in self.builtinringtones: 0055 _idx=_l[0] 0056 for _e in _l[1]: 0057 res[_idx]={ 'name': _e, 'origin': 'builtin' } 0058 _idx+=1 0059 # now the custome one 0060 _buf=prototypes.buffer(self.getfilecontents( 0061 self.protocolclass.RT_INDEX_FILE)) 0062 _idx_file=self.protocolclass.ringtone_index_file() 0063 _idx_file.readfrombuffer(_buf, logtitle='Read ringtone index file') 0064 for _entry in _idx_file.items: 0065 _filename=self.decode_utf16(_entry.name) 0066 _name=common.basename(_filename) 0067 if self.protocolclass.valid_rt_filename(_name): 0068 res[_entry.index]={ 'name': _name, 0069 'filename': _filename, 0070 'type': _entry.ringtone_type, 0071 'origin': 'ringers' } 0072 return res 0073 0074 def getringtones(self, fundamentals): 0075 """Retrieve ringtones data""" 0076 self.log('Reading ringtones') 0077 self.setmode(self.MODEOBEX) 0078 _res={} 0079 _rt_index=fundamentals.get('ringtone-index', {}) 0080 for _entry in _rt_index.values(): 0081 if _entry.has_key('filename'): 0082 try: 0083 _res[_entry['name']]=self.obex.getfilecontents( 0084 self.protocolclass.OBEXName(_entry['filename'])) 0085 except: 0086 self.log('Failed to read media file %s'%_entry['filename']) 0087 fundamentals['ringtone']=_res 0088 self.setmode(self.MODEMODEM) 0089 return fundamentals 0090 0091 def saveringtones(self, fundamentals, merge): 0092 """Save ringtones to the phone""" 0093 self.log('Writing ringtones to the phone') 0094 try: 0095 _del_list, _new_list=self._get_del_new_list('ringtone-index', 0096 'ringtone', 0097 merge, 0098 fundamentals, 0099 frozenset(['ringers'])) 0100 # delete files, need to be in OBEX mode 0101 self.setmode(self.MODEOBEX) 0102 self._del_files('ringtone-index', 'audio', 0103 _del_list, fundamentals) 0104 # and add new files, need to be in OBEX mode 0105 self._add_files('ringtone-index', 'ringtone', 'audio', 0106 _new_list, fundamentals) 0107 except: 0108 if __debug__: 0109 self.setmode(self.MODEMODEM) 0110 raise 0111 self.setmode(self.MODEMODEM) 0112 return fundamentals 0113 0114 def savewallpapers(self, fundamentals, merge): 0115 """Save wallpapers to the phone""" 0116 self.log('Writing wallpapers to the phone') 0117 try: 0118 _del_list, _new_list=self._get_del_new_list('wallpaper-index', 0119 'wallpapers', 0120 merge, 0121 fundamentals, 0122 frozenset(['images'])) 0123 # delete files, need to be in OBEX mode 0124 self.setmode(self.MODEOBEX) 0125 self._del_files('wallpaper-index', 'picture', 0126 _del_list, fundamentals) 0127 # and add new files, need to be in OBEX mode 0128 self._add_files('wallpaper-index', 'wallpapers', 'picture', 0129 _new_list, fundamentals) 0130 except: 0131 if __debug__: 0132 self.setmode(self.MODEMODEM) 0133 raise 0134 self.setmode(self.MODEMODEM) 0135 return fundamentals 0136 0137 #------------------------------------------------------------------------------- 0138 parentprofile=v3m.Profile 0139 class Profile(parentprofile): 0140 serialsname=Phone.serialsname 0141 phone_model='V3mM' 0142 0143 _supportedsyncs=( 0144 ('phonebook', 'read', None), # all phonebook reading 0145 ('phonebook', 'write', 'OVERWRITE'), # only overwriting phonebook 0146 ('calendar', 'read', None), # all calendar reading 0147 ('calendar', 'write', 'OVERWRITE'), # only overwriting calendar 0148 ('ringtone', 'read', None), # all ringtone reading 0149 ('ringtone', 'write', None), 0150 ('ringtone', 'write', 'OVERWRITE'), 0151 ('wallpaper', 'read', None), # all wallpaper reading 0152 ('wallpaper', 'write', None), 0153 ('wallpaper', 'write', 'OVERWRITE'), 0154 ('sms', 'read', None), 0155 ) 0156
Generated by PyXR 0.9.4