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

Source Code for Module phones.com_samsungsphn200

  1  ### BITPIM 
  2  ### 
  3  ### Copyright (C) 2005 Stephen Wood <saw@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_samsungsphn200.py 2533 2005-09-23 02:49:11Z sawecw $ 
  9   
 10  """Communicate with a Samsung SPH-N200""" 
 11   
 12  import sha 
 13  import re 
 14  import struct 
 15   
 16  import common 
 17  import commport 
 18  import time 
 19  import p_samsungsphn200 
 20  import p_brew 
 21  import com_brew 
 22  import com_phone 
 23  import com_samsung_packet 
 24  import prototypes 
 25   
 26  numbertypetab=('home','office','cell','pager','fax','none') 
 27   
28 -class Phone(com_samsung_packet.Phone):
29 "Talk to a Samsung SPH-N200 phone" 30 31 desc="SPH-N200" 32 33 protocolclass=p_samsungsphn200 34 serialsname='sphn200' 35 __groups_range=xrange(5) 36 37 imagelocations=() 38 # offset, index file, files location, type, maximumentries 39 40 __ams_index_file="ams/AmsRegistry" 41
42 - def __init__(self, logtarget, commport):
43 com_samsung_packet.Phone.__init__(self, logtarget, commport) 44 self.numbertypetab=numbertypetab 45 self.mode=self.MODENONE
46
47 - def getfundamentals(self, results):
48 """Gets information fundamental to interopating with the phone and UI.""" 49 50 # use a hash of ESN and other stuff (being paranoid) 51 self.log("Retrieving fundamental phone information") 52 self.log("Phone serial number") 53 print "Calling setmode MODEMODEM" 54 self.setmode(self.MODEMODEM) 55 print "Getting serial number" 56 results['uniqueserial']=sha.new(self.get_esn()).hexdigest() 57 58 self.log("Fundamentals retrieved") 59 return results
60
61 - def _setmodemodem(self):
62 self.log("_setmodemodem") 63 64 # Just try waking phone up first 65 try: 66 self.comm.sendatcommand("Z") 67 self.comm.sendatcommand('E0V1') 68 return True 69 except: 70 pass 71 72 # Should be in modem mode. Wake up the interface 73 for baud in (0, 19200, 38400, 115200): 74 self.log("Baud="+`baud`) 75 if baud: 76 if not self.comm.setbaudrate(baud): 77 continue 78 79 try: 80 self.comm.sendatcommand("Z") 81 self.comm.sendatcommand('E0V1') 82 return True 83 except: 84 pass 85 86 return False
87
88 - def getphonebook(self, result):
89 """Read the phonebook data.""" 90 pbook={} 91 self.setmode(self.MODEPHONEBOOK) 92 93 count=0 94 req=self.protocolclass.phonebookslotrequest() 95 for slot in range(2,self.protocolclass.NUMPHONEBOOKENTRIES+1): 96 req.slot=slot 97 res=self.sendpbcommand(req, self.protocolclass.phonebookslotresponse, fixup=self.pblinerepair) 98 if len(res) > 0: 99 lastname=res[0].entry.name 100 self.log(`slot`+": "+lastname) 101 entry=self.extractphonebookentry(res[0].entry, result) 102 pbook[count]=entry 103 count+=1 104 self.progress(slot, self.protocolclass.NUMPHONEBOOKENTRIES, lastname) 105 result['phonebook']=pbook 106 107 return pbook
108
109 - def extractphonebookentry(self, entry, fundamentals):
110 res={} 111 112 res['serials']=[ {'sourcetype': self.serialsname, 113 'slot': entry.slot, 114 'sourceuniqueid': fundamentals['uniqueserial']} ] 115 # only one name 116 res['names']=[ {'full': entry.name} ] 117 118 res['numbers']=[] 119 secret=0 120 121 for i in range(len(entry.numbers)): 122 type = self.numbertypetab[entry.numbers[i].numbertype - 1] 123 numhash = {'number': entry.numbers[i].number, 'type': type } 124 res['numbers'].append(numhash) 125 126 # Field after each number is secret flag. Setting secret on 127 # phone sets secret flag for every defined phone number 128 res['flags']=[ {'secret': secret} ] 129 130 return res
131
132 - def savephonebook(self, data):
133 "Saves out the phonebook" 134 135 self.setmode(self.MODEPHONEBOOK) 136 pb=data['phonebook'] 137 keys=pb.keys() 138 keys.sort() 139 140 keys=keys[:self.protocolclass.NUMPHONEBOOKENTRIES+1] 141 142 # 143 # Read the existing phonebook so that we cache birthdays 144 # Erase all entries, being carefull to modify entries with 145 # with URL's first 146 # 147 uslots={} 148 names={} 149 150 req=self.protocolclass.phonebooksloterase() 151 self.log('Erasing '+self.desc+' phonebook') 152 progressmax=self.protocolclass.NUMPHONEBOOKENTRIES+len(keys) 153 for slot in range(2,self.protocolclass.NUMPHONEBOOKENTRIES+1): 154 req.slot = slot 155 self.progress(slot,progressmax,"Erasing "+`slot`) 156 res=self.sendpbcommand(req, self.protocolclass.phonebookslotupdateresponse) 157 158 159 for i in range(len(keys)): 160 slot=keys[i] 161 req=self.protocolclass.phonebookslotupdaterequest() 162 req.entry=self.makeentry(pb[slot],data) 163 self.log('Writing entry '+`slot`+" - "+req.entry.name) 164 self.progress(i+self.protocolclass.NUMPHONEBOOKENTRIES,progressmax,"Writing "+req.entry.name) 165 self.sendpbcommand(req, self.protocolclass.phonebookslotupdateresponse) 166 self.progress(progressmax+1,progressmax+1, "Phone book write completed") 167 return data
168
169 - def makeentry(self, entry, data):
170 e=self.protocolclass.pbentry() 171 172 for k in entry: 173 # special treatment for lists 174 if k=='numbertypes' or k=='secrets': 175 continue 176 if k=='ringtone': 177 # e.ringtone=self._findmediaindex(data['ringtone-index'], entry['ringtone'], entry['name'], 'ringtone') 178 continue 179 elif k=='wallpaper': 180 # e.wallpaper=self._findmediaindex(data['wallpaper-index'], entry['wallpaper'], entry['name'], 'wallpaper') 181 continue 182 elif k=='numbers': 183 #l=getattr(e,k) 184 nnum=len(entry[k]) 185 for i in range(nnum): 186 enpn=self.protocolclass.phonenumber() 187 if i+1 == nnum: 188 enpn.last_number=True 189 enpn.numbertype=entry['numbertypes'][i]+1 190 enpn.number=entry[k][i] 191 e.numbers.append(enpn) 192 continue 193 # everything else we just set 194 setattr(e, k, entry[k]) 195 return e
196 197 198 getwallpapers=None 199 getringtones=None
200
201 -class Profile(com_samsung_packet.Profile):
202 protocolclass=Phone.protocolclass 203 serialsname=Phone.serialsname 204 phone_manufacturer='SAMSUNG' 205 phone_model='SPH-N200' 206 deviceclasses=("serial",) 207
208 - def __init__(self):
211 212 _supportedsyncs=( 213 ('phonebook', 'read', None), # all phonebook reading 214 ('phonebook', 'write', 'OVERWRITE'), # only overwriting phonebook 215 ) 216
217 - def convertphonebooktophone(self, helper, data):
218 """Converts the data to what will be used by the phone 219 220 @param data: contains the dict returned by getfundamentals 221 as well as where the results go""" 222 223 results={} 224 225 # find which entries are already known to this phone 226 pb=data['phonebook'] 227 # decorate list with (slot, pbkey) tuples 228 slots=[ (helper.getserial(pb[pbentry].get("serials", []), self.serialsname, data['uniqueserial'], "slot", None), pbentry) 229 for pbentry in pb] 230 slots.sort() # numeric order 231 # make two lists - one contains known slots, one doesn't 232 newones=[(pbentry,slot) for slot,pbentry in slots if slot is None] 233 existing=[(pbentry,slot) for slot,pbentry in slots if slot is not None] 234 235 uslotsused={} 236 237 tempslot=0 # Temporarily just pick slots and speed dial in order 238 for pbentry,slot in existing+newones: 239 240 if len(results)==self.protocolclass.NUMPHONEBOOKENTRIES: 241 break 242 243 try: 244 245 e={} # entry out 246 247 entry=data['phonebook'][pbentry] 248 249 secret=helper.getflag(entry.get('flags', []), 'secret', False) 250 if secret: 251 secret=1 252 else: 253 secret=0 254 255 # name 256 e['name']=helper.getfullname(entry.get('names', []),1,1,12)[0] 257 258 cat=helper.makeone(helper.getcategory(entry.get('cagetgories',[]),0,1,12), None) 259 260 # phone numbers 261 # there must be at least one phone number 262 minnumbers=1 263 numbers=helper.getnumbers(entry.get('numbers', []),minnumbers,self.protocolclass.NUMPHONENUMBERS) 264 e['numbertypes']=[] 265 e['numbers']=[] 266 e['secrets']=[] 267 unusednumbers=[] # Hold duplicate types here 268 typesused={} 269 defaulttypenum=0 270 for num in numbers: 271 typename=num['type'] 272 if typesused.has_key(typename): 273 unusednumbers.append(num) 274 continue 275 typesused[typename]=1 276 for typenum,tnsearch in enumerate(self.numbertypetab): 277 if typename==tnsearch: 278 if defaulttypenum==0: 279 defaulttypenum=typenum 280 number=self.phonize(num['number']) 281 if len(number)>self.protocolclass.MAXNUMBERLEN: 282 # :: TODO:: number is too long and we have to either truncate it or ignore it? 283 number=number[:self.protocolclass.MAXNUMBERLEN] 284 e['numbers'].append(number) 285 if(num.has_key('speeddial')): 286 # Only one number per name can be a speed dial 287 # Should make speed dial be the first that 288 # we come accross 289 e['speeddial']=typenum 290 tryuslot = num['speeddial'] 291 e['numbertypes'].append(typenum) 292 e['secrets'].append(secret) 293 294 break 295 296 # Should print to log when a requested speed dial slot is 297 # not available 298 if e.has_key('speeddial'): 299 if tryuslot>=1 and tryuslot<=self.protocolclass.NUMPHONEBOOKENTRIES and not uslotsused.has_key(tryuslot): 300 uslotsused[tryuslot]=1 301 e['uslot']=tryuslot 302 else: 303 e['speeddial']=defaulttypenum 304 305 # find the right slot 306 if slot is None or slot<2 or slot>self.protocolclass.NUMPHONEBOOKENTRIES or slot in results: 307 for i in range(2,100000): 308 if i not in results: 309 slot=i 310 break 311 312 e['slot']=slot 313 314 results[slot]=e 315 except helper.ConversionFailed: 316 continue 317 318 # Fill in uslot for entries that don't have it. 319 320 tryuslot=1 321 for slot in results.keys(): 322 323 e=results[slot] 324 if not e.has_key('uslot'): 325 while tryuslot<self.protocolclass.NUMPHONEBOOKENTRIES and uslotsused.has_key(tryuslot): 326 tryuslot += 1 327 uslotsused[tryuslot]=1 328 e['uslot'] = tryuslot 329 results[slot] = e 330 331 data['phonebook']=results 332 return data
333
334 - def phonize(self,str):
335 """Convert the phone number into something the phone understands 336 All digits, P, T, * and # are kept, everything else is removed""" 337 338 return re.sub("[^0-9PT#*]", "", str)[:self.protocolclass.MAXNUMBERLEN]
339