Package phones :: Module com_motov710m
[hide private]
[frames] | no frames]

Source Code for Module phones.com_motov710m

  1  ### BITPIM 
  2  ### 
  3  ### Copyright (C) 2006 Joe Pham <djpham@bitpim.org> 
  4  ### 
  5  ### This program is free software; you can redistribute it and/or modify 
  6  ### it under the terms of the BitPim license as detailed in the LICENSE file. 
  7  ### 
  8  ### $Id: com_motov710m.py 4516 2007-12-21 22:00:57Z djpham $ 
  9   
 10  """Communicate with Motorola phones using AT commands""" 
 11  # system modules 
 12  import time 
 13   
 14  # BitPim modules 
 15  import bp_obex 
 16  import common 
 17  import com_motov710 
 18  import p_motov710 
 19  import helpids 
 20   
 21  parentphone=com_motov710.Phone 
22 -class Phone(parentphone):
23 """ Talk to a Motorola V710 phone""" 24 desc='Moto-V710m' 25 helpid=helpids.ID_PHONE_MOTOV710M 26 protocolclass=p_motov710 27 serialsname='motov710m' 28 MODEOBEX='modeobex' 29
30 - def __init__(self, logtarget, commport):
31 parentphone.__init__(self, logtarget, commport) 32 self.obex=None
33 34 # mode routines
35 - def _setmodeobex(self):
36 self.setmode(self.MODEMODEM) 37 self.log('Switching OBEX') 38 _req=self.protocolclass.modeset() 39 _req.mode=self.protocolclass.MODE_OBEX 40 self.sendATcommand(_req, None) 41 time.sleep(0.5) 42 self.obex=bp_obex.FolderBrowsingService(self, self.comm) 43 if self.obex.connect(): 44 return True 45 del self.obex 46 self.obex=None 47 return False
48
49 - def _setmodeobextomodem(self):
50 if self.obex: 51 self.log('Switching from OBEX to modem') 52 self.obex.disconnect() 53 del self.obex 54 self.obex=None 55 return True
56 57 # Ringtones stuff----------------------------------------------------------
58 - def _read_obex_media(self, index_key, media_key, media_path, 59 fundamentals):
60 # read media files through OBEX in case BREW fails 61 # need to be in OBEX mode 62 _media=fundamentals.get(media_key, {}) 63 _dir_list=fundamentals.get(media_path, {}) 64 for _key,_entry in fundamentals.get(index_key, {}).items(): 65 if _entry.get('filename', None) and \ 66 not _media.has_key(_entry['name']): 67 # this one associates with a file AND has not been read 68 try: 69 _filename=media_path+'/'+common.basename(_entry['filename']) 70 _filesize=_dir_list.get(_entry['filename'], {}).get('size', None) 71 _media[_entry['name']]=self.obex.getfilecontents(_filename, 72 _filesize) 73 except: 74 self.log('Failed to read media file.') 75 if __debug__: 76 raise 77 return _media
78
79 - def getringtones(self, fundamentals):
80 """Retrieve ringtones data""" 81 self.log('Reading ringtones') 82 self.setmode(self.MODEPHONEBOOK) 83 self.setmode(self.MODEBREW) 84 try: 85 fundamentals['audio']=self.listfiles(self.protocolclass.RT_PATH) 86 except: 87 fundamentals['audio']={} 88 self.setmode(self.MODEOBEX) 89 try: 90 fundamentals['ringtone']=self._read_obex_media('ringtone-index', 91 'ringtone', 92 'audio', 93 fundamentals) 94 except: 95 if __debug__: 96 self.setmode(self.MODEMODEM) 97 raise 98 self.setmode(self.MODEMODEM) 99 del fundamentals['audio'] 100 return fundamentals
101
102 - def _get_del_new_list(self, index_key, media_key, merge, fundamentals, 103 origins):
104 """Return a list of media being deleted and being added""" 105 _index=fundamentals.get(index_key, {}) 106 _media=fundamentals.get(media_key, {}) 107 _index_file_list=[_entry['name'] for _entry in _index.values() \ 108 if _entry.has_key('filename') and \ 109 _entry.get('origin', None) in origins ] 110 _bp_file_list=[_entry['name'] for _entry in _media.values() \ 111 if _entry.get('origin', None) in origins ] 112 if merge: 113 # just add the new files, don't delete anything 114 _del_list=[] 115 _new_list=_bp_file_list 116 else: 117 # Delete specified files and add everything 118 _del_list=[x for x in _index_file_list if x not in _bp_file_list] 119 _new_list=_bp_file_list 120 return _del_list, _new_list
121
122 - def _del_files(self, index_key, media_path, _del_list, fundamentals):
123 """Delete specified media files, need to be in OBEX mode""" 124 _index=fundamentals.get(index_key, {}) 125 for _file in _del_list: 126 _file_name=media_path+'/'+_file 127 try: 128 self.obex.rmfile(_file_name) 129 except Exception, e: 130 self.log('Failed to delete OBEX file %s: %s'%(_file_name, `e`))
131
132 - def _replace_files(self, index_key, media_key, new_list, fundamentals):
133 """Replace existing files with new contents using BREW""" 134 _index=fundamentals.get(index_key, {}) 135 _media=fundamentals.get(media_key, {}) 136 for _file in new_list: 137 _data=self._item_from_index(_file, 'data', _media) 138 if not _data: 139 self.log('Failed to write file %s due to no data'%_file) 140 continue 141 _file_name=self._item_from_index(_file, 'filename', _index) 142 if _file_name: 143 # existing file, check if the same one 144 _stat=self.statfile(_file_name) 145 if _stat and _stat['size']!=len(_data): 146 # different size, replace it 147 try: 148 self.writefile(_file_name, _data) 149 except: 150 self.log('Failed to write BREW file '+_file_name) 151 if __debug__: 152 raise
153
154 - def _add_files(self, index_key, media_key, media_path, 155 new_list, fundamentals):
156 """Add new file using OBEX""" 157 _index=fundamentals.get(index_key, {}) 158 _media=fundamentals.get(media_key, {}) 159 for _file in new_list: 160 _data=self._item_from_index(_file, 'data', _media) 161 if not _data: 162 self.log('Failed to write file %s due to no data'%_file) 163 continue 164 if self._item_from_index(_file, None, _index) is None: 165 # new file 166 _file_name=media_path+'/'+_file 167 try: 168 self.obex.writefile(_file_name, _data) 169 except: 170 self.log('Failed to write OBEX file '+_file_name) 171 if __debug__: 172 raise
173
174 - def saveringtones(self, fundamentals, merge):
175 """Save ringtones to the phone""" 176 self.log('Writing ringtones to the phone') 177 self.setmode(self.MODEPHONEBOOK) 178 self.setmode(self.MODEBREW) 179 try: 180 _del_list, _new_list=self._get_del_new_list('ringtone-index', 181 'ringtone', 182 merge, 183 fundamentals, 184 frozenset(['ringers'])) 185 # replace files, need to be in BREW mode 186 self._replace_files('ringtone-index', 'ringtone', 187 _new_list, fundamentals) 188 # delete files, need to be in OBEX mode 189 self.setmode(self.MODEOBEX) 190 self._del_files('ringtone-index', 'audio', 191 _del_list, fundamentals) 192 # and add new files, need to be in OBEX mode 193 self._add_files('ringtone-index', 'ringtone', 'audio', 194 _new_list, fundamentals) 195 except: 196 if __debug__: 197 self.setmode(self.MODEMODEM) 198 raise 199 self.setmode(self.MODEMODEM) 200 return fundamentals
201
202 - def savewallpapers(self, fundamentals, merge):
203 """Save wallpapers to the phone""" 204 self.log('Writing wallpapers to the phone') 205 self.setmode(self.MODEPHONEBOOK) 206 self.setmode(self.MODEBREW) 207 try: 208 _del_list, _new_list=self._get_del_new_list('wallpaper-index', 209 'wallpapers', 210 merge, 211 fundamentals, 212 frozenset(['images'])) 213 # replace files, need to be in BREW mode 214 self._replace_files('wallpaper-index', 'wallpapers', 215 _new_list, fundamentals) 216 # delete files, need to be in OBEX mode 217 self.setmode(self.MODEOBEX) 218 self._del_files('wallpaper-index', 'picture', 219 _del_list, fundamentals) 220 # and add new files, need to be in OBEX mode 221 self._add_files('wallpaper-index', 'wallpapers', 'picture', 222 _new_list, fundamentals) 223 except: 224 if __debug__: 225 self.setmode(self.MODEMODEM) 226 raise 227 self.setmode(self.MODEMODEM) 228 return fundamentals
229 230 #------------------------------------------------------------------------------ 231 parentprofile=com_motov710.Profile
232 -class Profile(parentprofile):
233 234 serialsname=Phone.serialsname 235 phone_model='V710M' 236 237 _supportedsyncs=( 238 ('phonebook', 'read', None), # all phonebook reading 239 ('phonebook', 'write', 'OVERWRITE'), # only overwriting phonebook 240 ('calendar', 'read', None), # all calendar reading 241 ('calendar', 'write', 'OVERWRITE'), # only overwriting calendar 242 ('ringtone', 'read', None), # all ringtone reading 243 ('ringtone', 'write', None), 244 ('ringtone', 'write', 'OVERWRITE'), 245 ('wallpaper', 'read', None), # all wallpaper reading 246 ('wallpaper', 'write', None), 247 ('wallpaper', 'write', 'OVERWRITE'), 248 ('sms', 'read', None), 249 )
250