0001 ### BITPIM 0002 ### 0003 ### Copyright (C) 2006 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_motov710m.py 4516 2007-12-21 22:00:57Z djpham $ 0009 0010 """Communicate with Motorola phones using AT commands""" 0011 # system modules 0012 import time 0013 0014 # BitPim modules 0015 import bp_obex 0016 import common 0017 import com_motov710 0018 import p_motov710 0019 import helpids 0020 0021 parentphone=com_motov710.Phone 0022 class Phone(parentphone): 0023 """ Talk to a Motorola V710 phone""" 0024 desc='Moto-V710m' 0025 helpid=helpids.ID_PHONE_MOTOV710M 0026 protocolclass=p_motov710 0027 serialsname='motov710m' 0028 MODEOBEX='modeobex' 0029 0030 def __init__(self, logtarget, commport): 0031 parentphone.__init__(self, logtarget, commport) 0032 self.obex=None 0033 0034 # mode routines 0035 def _setmodeobex(self): 0036 self.setmode(self.MODEMODEM) 0037 self.log('Switching OBEX') 0038 _req=self.protocolclass.modeset() 0039 _req.mode=self.protocolclass.MODE_OBEX 0040 self.sendATcommand(_req, None) 0041 time.sleep(0.5) 0042 self.obex=bp_obex.FolderBrowsingService(self, self.comm) 0043 if self.obex.connect(): 0044 return True 0045 del self.obex 0046 self.obex=None 0047 return False 0048 0049 def _setmodeobextomodem(self): 0050 if self.obex: 0051 self.log('Switching from OBEX to modem') 0052 self.obex.disconnect() 0053 del self.obex 0054 self.obex=None 0055 return True 0056 0057 # Ringtones stuff---------------------------------------------------------- 0058 def _read_obex_media(self, index_key, media_key, media_path, 0059 fundamentals): 0060 # read media files through OBEX in case BREW fails 0061 # need to be in OBEX mode 0062 _media=fundamentals.get(media_key, {}) 0063 _dir_list=fundamentals.get(media_path, {}) 0064 for _key,_entry in fundamentals.get(index_key, {}).items(): 0065 if _entry.get('filename', None) and \ 0066 not _media.has_key(_entry['name']): 0067 # this one associates with a file AND has not been read 0068 try: 0069 _filename=media_path+'/'+common.basename(_entry['filename']) 0070 _filesize=_dir_list.get(_entry['filename'], {}).get('size', None) 0071 _media[_entry['name']]=self.obex.getfilecontents(_filename, 0072 _filesize) 0073 except: 0074 self.log('Failed to read media file.') 0075 if __debug__: 0076 raise 0077 return _media 0078 0079 def getringtones(self, fundamentals): 0080 """Retrieve ringtones data""" 0081 self.log('Reading ringtones') 0082 self.setmode(self.MODEPHONEBOOK) 0083 self.setmode(self.MODEBREW) 0084 try: 0085 fundamentals['audio']=self.listfiles(self.protocolclass.RT_PATH) 0086 except: 0087 fundamentals['audio']={} 0088 self.setmode(self.MODEOBEX) 0089 try: 0090 fundamentals['ringtone']=self._read_obex_media('ringtone-index', 0091 'ringtone', 0092 'audio', 0093 fundamentals) 0094 except: 0095 if __debug__: 0096 self.setmode(self.MODEMODEM) 0097 raise 0098 self.setmode(self.MODEMODEM) 0099 del fundamentals['audio'] 0100 return fundamentals 0101 0102 def _get_del_new_list(self, index_key, media_key, merge, fundamentals, 0103 origins): 0104 """Return a list of media being deleted and being added""" 0105 _index=fundamentals.get(index_key, {}) 0106 _media=fundamentals.get(media_key, {}) 0107 _index_file_list=[_entry['name'] for _entry in _index.values() \ 0108 if _entry.has_key('filename') and \ 0109 _entry.get('origin', None) in origins ] 0110 _bp_file_list=[_entry['name'] for _entry in _media.values() \ 0111 if _entry.get('origin', None) in origins ] 0112 if merge: 0113 # just add the new files, don't delete anything 0114 _del_list=[] 0115 _new_list=_bp_file_list 0116 else: 0117 # Delete specified files and add everything 0118 _del_list=[x for x in _index_file_list if x not in _bp_file_list] 0119 _new_list=_bp_file_list 0120 return _del_list, _new_list 0121 0122 def _del_files(self, index_key, media_path, _del_list, fundamentals): 0123 """Delete specified media files, need to be in OBEX mode""" 0124 _index=fundamentals.get(index_key, {}) 0125 for _file in _del_list: 0126 _file_name=media_path+'/'+_file 0127 try: 0128 self.obex.rmfile(_file_name) 0129 except Exception, e: 0130 self.log('Failed to delete OBEX file %s: %s'%(_file_name, `e`)) 0131 0132 def _replace_files(self, index_key, media_key, new_list, fundamentals): 0133 """Replace existing files with new contents using BREW""" 0134 _index=fundamentals.get(index_key, {}) 0135 _media=fundamentals.get(media_key, {}) 0136 for _file in new_list: 0137 _data=self._item_from_index(_file, 'data', _media) 0138 if not _data: 0139 self.log('Failed to write file %s due to no data'%_file) 0140 continue 0141 _file_name=self._item_from_index(_file, 'filename', _index) 0142 if _file_name: 0143 # existing file, check if the same one 0144 _stat=self.statfile(_file_name) 0145 if _stat and _stat['size']!=len(_data): 0146 # different size, replace it 0147 try: 0148 self.writefile(_file_name, _data) 0149 except: 0150 self.log('Failed to write BREW file '+_file_name) 0151 if __debug__: 0152 raise 0153 0154 def _add_files(self, index_key, media_key, media_path, 0155 new_list, fundamentals): 0156 """Add new file using OBEX""" 0157 _index=fundamentals.get(index_key, {}) 0158 _media=fundamentals.get(media_key, {}) 0159 for _file in new_list: 0160 _data=self._item_from_index(_file, 'data', _media) 0161 if not _data: 0162 self.log('Failed to write file %s due to no data'%_file) 0163 continue 0164 if self._item_from_index(_file, None, _index) is None: 0165 # new file 0166 _file_name=media_path+'/'+_file 0167 try: 0168 self.obex.writefile(_file_name, _data) 0169 except: 0170 self.log('Failed to write OBEX file '+_file_name) 0171 if __debug__: 0172 raise 0173 0174 def saveringtones(self, fundamentals, merge): 0175 """Save ringtones to the phone""" 0176 self.log('Writing ringtones to the phone') 0177 self.setmode(self.MODEPHONEBOOK) 0178 self.setmode(self.MODEBREW) 0179 try: 0180 _del_list, _new_list=self._get_del_new_list('ringtone-index', 0181 'ringtone', 0182 merge, 0183 fundamentals, 0184 frozenset(['ringers'])) 0185 # replace files, need to be in BREW mode 0186 self._replace_files('ringtone-index', 'ringtone', 0187 _new_list, fundamentals) 0188 # delete files, need to be in OBEX mode 0189 self.setmode(self.MODEOBEX) 0190 self._del_files('ringtone-index', 'audio', 0191 _del_list, fundamentals) 0192 # and add new files, need to be in OBEX mode 0193 self._add_files('ringtone-index', 'ringtone', 'audio', 0194 _new_list, fundamentals) 0195 except: 0196 if __debug__: 0197 self.setmode(self.MODEMODEM) 0198 raise 0199 self.setmode(self.MODEMODEM) 0200 return fundamentals 0201 0202 def savewallpapers(self, fundamentals, merge): 0203 """Save wallpapers to the phone""" 0204 self.log('Writing wallpapers to the phone') 0205 self.setmode(self.MODEPHONEBOOK) 0206 self.setmode(self.MODEBREW) 0207 try: 0208 _del_list, _new_list=self._get_del_new_list('wallpaper-index', 0209 'wallpapers', 0210 merge, 0211 fundamentals, 0212 frozenset(['images'])) 0213 # replace files, need to be in BREW mode 0214 self._replace_files('wallpaper-index', 'wallpapers', 0215 _new_list, fundamentals) 0216 # delete files, need to be in OBEX mode 0217 self.setmode(self.MODEOBEX) 0218 self._del_files('wallpaper-index', 'picture', 0219 _del_list, fundamentals) 0220 # and add new files, need to be in OBEX mode 0221 self._add_files('wallpaper-index', 'wallpapers', 'picture', 0222 _new_list, fundamentals) 0223 except: 0224 if __debug__: 0225 self.setmode(self.MODEMODEM) 0226 raise 0227 self.setmode(self.MODEMODEM) 0228 return fundamentals 0229 0230 #------------------------------------------------------------------------------ 0231 parentprofile=com_motov710.Profile 0232 class Profile(parentprofile): 0233 0234 serialsname=Phone.serialsname 0235 phone_model='V710M' 0236 0237 _supportedsyncs=( 0238 ('phonebook', 'read', None), # all phonebook reading 0239 ('phonebook', 'write', 'OVERWRITE'), # only overwriting phonebook 0240 ('calendar', 'read', None), # all calendar reading 0241 ('calendar', 'write', 'OVERWRITE'), # only overwriting calendar 0242 ('ringtone', 'read', None), # all ringtone reading 0243 ('ringtone', 'write', None), 0244 ('ringtone', 'write', 'OVERWRITE'), 0245 ('wallpaper', 'read', None), # all wallpaper reading 0246 ('wallpaper', 'write', None), 0247 ('wallpaper', 'write', 'OVERWRITE'), 0248 ('sms', 'read', None), 0249 ) 0250
Generated by PyXR 0.9.4