PyXR

c:\projects\bitpim\src \ phones \ com_motov710m.py



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