0001 ### BITPIM 0002 ### 0003 ### Copyright (C) 2006 Stephen Wood <sawecw@users.sf.net> 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_sanyo6600.py 4531 2007-12-28 04:23:09Z sawecw $ 0009 0010 """Talk to the Sanyo Katana (SCP-6600) cell phone""" 0011 # standard modules 0012 import re 0013 import time 0014 import sha 0015 0016 # my modules 0017 import common 0018 import helpids 0019 import p_brew 0020 import p_sanyo8300 0021 import p_sanyo4930 0022 import p_sanyo6600 0023 import com_brew 0024 import com_phone 0025 import com_sanyo 0026 import com_sanyomedia 0027 import com_sanyonewer 0028 import com_sanyo3100 0029 import prototypes 0030 import bpcalendar 0031 0032 numbertypetab=( 'cell', 'home', 'office', 'pager', 0033 'fax', 'none') 0034 0035 class Phone(com_sanyo3100.Phone): 0036 "Talk to the Sanyo Katana (SCP-6600) cell phone" 0037 0038 desc="SCP-6600" 0039 helpid=helpids.ID_PHONE_SANYOSCP6600 0040 0041 FIRST_MEDIA_DIRECTORY=1 0042 LAST_MEDIA_DIRECTORY=2 0043 0044 imagelocations=( 0045 # offset, directory #, indexflag, type, maximumentries 0046 ) 0047 wallpaperexts=(".jpg", ".png", ".mp4", ".3g2",".JPG") 0048 0049 0050 protocolclass=p_sanyo6600 0051 serialsname='scp6600' 0052 0053 builtinringtones=( 'None', 'Vibrate', '', '', '', '', '', '', '', 0054 'Tone 1', 'Tone 2', 'Tone 3', 'Tone 4', 'Tone 5', 0055 'Tone 6', 'Tone 7', 'Tone 8', '', '', '', '', '', 0056 '', '', '', '', 0057 'Requiem:Dies Irae', 'Minute Waltz', 'Hungarian Dance', 0058 'Military March', 'Ten Little Indians', 0059 'Head,Shoulders,Knees&Toes', 'The Moment', 'Asian Jingle', 0060 'Kung-fu','','','','','','','','','','','','','','','','','', 0061 '','','','','','', 0062 'Voice Alarm') 0063 0064 0065 # f1ff None 65521 0066 # FFF2: Vibrate 65522 0067 # pb cal 0068 # Tone 1: 33 43 0069 # Requium: 60 60 0070 # Kung Fu: 68 0071 # Download: 135 0072 calendar_defaultringtone=0 0073 calendar_defaultcaringtone=0 0074 calendar_toneoffset=33 0075 calendar_tonerange=xrange(4,100) 0076 0077 def __init__(self, logtarget, commport): 0078 com_sanyo3100.Phone.__init__(self, logtarget, commport) 0079 self.mode=self.MODENONE 0080 self.numbertypetab=numbertypetab 0081 0082 def getfundamentals(self, results): 0083 """Gets information fundamental to interopating with the phone and UI.""" 0084 results['uniqueserial']=sha.new(self.get_esn()).hexdigest() 0085 self.getmediaindices(results) 0086 0087 results['groups']=self.read_groups() 0088 0089 self.log("Fundamentals retrieved") 0090 0091 return results 0092 0093 def read_groups(self): 0094 g={} 0095 0096 req=self.protocolclass.grouprequest() 0097 for slot in range(1,self.protocolclass.NUMGROUPS+1): 0098 req.slot = slot 0099 res=self.sendpbcommand(req, self.protocolclass.groupresponse) 0100 if res.entry.groupname_len: 0101 g[slot]={'name': res.entry.groupname} 0102 return g 0103 0104 def savegroups(self, data): 0105 """Write the groups, sending only those groups that have had 0106 a name change. (So that ringers don't get messed up)""" 0107 groups=data['groups'] 0108 0109 groups_onphone=self.read_groups() # Get groups on phone 0110 0111 # If groups read doesn't work, don't try to write groups 0112 if not groups_onphone: 0113 return 0114 0115 keys=groups.keys() 0116 keys.sort() 0117 print "Bitpim group keys",keys 0118 print "Onphone group keys",groups_onphone.keys() 0119 0120 for k in keys: 0121 if groups[k]['name']!="Unassigned": 0122 if not groups_onphone.has_key(k) \ 0123 or groups[k]['name']!=groups_onphone[k]['name']: 0124 print "Wrinting ",groups[k]['name']," to ",k 0125 req=self.protocolclass.groupupdaterequest() 0126 req.slot=k 0127 req.entry.slot=k 0128 req.entry.groupname=groups[k]['name'] 0129 req.entry.groupname_len=len(groups[k]['name']) 0130 self.sendpbcommand(req, self.protocolclass.groupresponse) 0131 groups_onphone[k]=groups[k] 0132 data['groups']=groups_onphone 0133 0134 def xgetmediaindices(self, results): 0135 "Just index builtin media for now." 0136 0137 com_sanyo.SanyoPhonebook.getmediaindices(self, results) 0138 ringermedia=results['ringtone-index'] 0139 imagemedia=results['wallpaper-index'] 0140 0141 results['ringtone-index']=ringermedia 0142 results['wallpaper-index']=imagemedia 0143 return 0144 0145 def getphonebook(self, result): 0146 "Code to retrieve packets we have discovered so far so we can work out their formats." 0147 pbook={} 0148 0149 sortstuff = self.getsanyobuffer(self.protocolclass.pbsortbuffer) 0150 0151 speedslot=[] 0152 for i in range(self.protocolclass._NUMSPEEDDIALS): 0153 speedslot.append(sortstuff.speeddialindex[i].numslot) 0154 0155 numentries=sortstuff.slotsused 0156 self.log("There are %d entries" % (numentries,)) 0157 0158 count = 0 # Number of phonebook entries 0159 numcount = 0 # Number of phone numbers 0160 numemail = 0 # Number of emails 0161 numurl = 0 # Number of urls 0162 0163 self.log(`sortstuff.groupslotsused`+" Groups") 0164 self.log(`sortstuff.slotsused`+" Contacts") 0165 self.log(`sortstuff.nameslotsused`+" Names") 0166 self.log(`sortstuff.numslotsused`+" Phone numbers") 0167 self.log(`sortstuff.emailslotsused`+" Email addresses") 0168 self.log(`sortstuff.urlslotsused`+" URLs") 0169 self.log(`sortstuff.num_address`+" Addresses") 0170 self.log(`sortstuff.num_memo`+" Memos") 0171 numentries=sortstuff.slotsused 0172 0173 reqindex=self.protocolclass.contactindexrequest() 0174 reqname=self.protocolclass.namerequest() 0175 reqnumber=self.protocolclass.numberrequest() 0176 reqemail=self.protocolclass.emailrequest() 0177 requrl=self.protocolclass.urlrequest() 0178 reqmemo=self.protocolclass.memorequest() 0179 reqaddress=self.protocolclass.addressrequest() 0180 for slot in range(self.protocolclass.NUMPHONEBOOKENTRIES): 0181 if sortstuff.usedflags[slot].used: 0182 entry={} 0183 reqindex.slot=slot 0184 resindex=self.sendpbcommand(reqindex,self.protocolclass.contactindexresponse) 0185 ringerid = resindex.entry.ringerid 0186 pictureid = resindex.entry.pictureid 0187 groupid = resindex.entry.groupid 0188 0189 if resindex.entry.namep>=0 and resindex.entry.namep<self.protocolclass.NUMPHONEBOOKENTRIES: 0190 0191 reqname.slot = resindex.entry.namep 0192 resname=self.sendpbcommand(reqname,self.protocolclass.nameresponse) 0193 name=resname.entry.name 0194 self.log(name) 0195 else: 0196 name="" 0197 self.log("No Name") 0198 print name,ringerid,pictureid 0199 0200 cat=result['groups'].get(groupid, {'name': "Unassigned"})['name'] 0201 if cat != 'Unassigned': 0202 entry['categories']=[ {'category': cat} ] 0203 entry['serials']=[ {'sourcetype': self.serialsname, 0204 0205 'slot': slot, 0206 'sourceuniqueid': result['uniqueserial']} ] 0207 entry['names']=[ {'full': name} ] 0208 if resindex.entry.secret: 0209 entry['flags']=[{'secret': True}] 0210 entry['numbers']=[] 0211 for numi in range(self.protocolclass.NUMPHONENUMBERS): 0212 nump=resindex.entry.numberps[numi].slot 0213 if nump < self.protocolclass.MAXNUMBERS: 0214 reqnumber.slot=nump 0215 resnumber=self.sendpbcommand(reqnumber,self.protocolclass.numberresponse) 0216 numhash={'number':resnumber.entry.number, 'type': self.numbertypetab[resnumber.entry.numbertype-1]} 0217 for j in range(len(speedslot)): 0218 if(speedslot[j]==nump): 0219 numhash['speeddial']=j+2 0220 break 0221 if resindex.entry.defaultnum==numi: 0222 entry['numbers'].insert(0,numhash) 0223 else: 0224 entry['numbers'].append(numhash) 0225 0226 urlp=resindex.entry.urlp 0227 if urlp<self.protocolclass.MAXURLS: 0228 requrl.slot=urlp 0229 resurl=self.sendpbcommand(requrl,self.protocolclass.urlresponse) 0230 entry['urls']=[ {'url': resurl.entry.url} ] 0231 memop=resindex.entry.memop 0232 if memop<self.protocolclass.MAXMEMOS: 0233 reqmemo.slot=memop 0234 resmemo=self.sendpbcommand(reqmemo,self.protocolclass.memoresponse) 0235 self.log("Memo: "+resmemo.entry.memo) 0236 entry['memos']=[ {'memo': resmemo.entry.memo} ] 0237 addressp=resindex.entry.addressp 0238 if addressp<self.protocolclass.MAXADDRESSES: 0239 reqaddress.slot=addressp 0240 resaddress=self.sendpbcommand(reqaddress,self.protocolclass.addressresponse) 0241 # Need to parse this address for phonebook.py 0242 self.log("Address: "+resaddress.entry.address) 0243 entry['addresses']=[ {'street': resaddress.entry.address} ] 0244 entry['emails']=[] 0245 for emaili in range(self.protocolclass.NUMEMAILS): 0246 emaili=resindex.entry.emailps[emaili].slot 0247 if emaili < self.protocolclass.MAXEMAILS: 0248 reqemail.slot=emaili 0249 resemail=self.sendpbcommand(reqemail,self.protocolclass.emailresponse) 0250 self.log("Email: "+resemail.entry.email) 0251 entry['emails'].append({'email': resemail.entry.email}) 0252 0253 pbook[count]=entry 0254 self.progress(count, numentries, name) 0255 count+=1 0256 numcount+=len(entry['numbers']) 0257 if entry.has_key('emails'): 0258 numemail+=len(entry['emails']) 0259 if entry.has_key('urls'): 0260 numurl+=len(entry['urls']) 0261 0262 0263 self.progress(numentries, numentries, "Phone book read completed") 0264 self.log("Phone contains "+`count`+" contacts, "+`numcount`+" phone numbers, "+`numemail`+" Emails, "+`numurl`+" URLs") 0265 result['phonebook']=pbook 0266 cats=[] 0267 for i in result['groups']: 0268 cats.append(result['groups'][i]['name']) 0269 result['categories']=cats 0270 return pbook 0271 0272 def savephonebook(self, data): 0273 newphonebook={} 0274 self.setmode(self.MODEBREW) 0275 self.setmode(self.MODEPHONEBOOK) 0276 0277 sortstuff=self.protocolclass.pbsortbuffer() 0278 0279 self.savegroups(data) 0280 groups=data['groups'] 0281 0282 for i in range(self.protocolclass._NUMSPEEDDIALS): 0283 sortstuff.speeddialindex.append(0xffff) 0284 0285 for i in range(self.protocolclass.NUMPHONEBOOKENTRIES): 0286 sortstuff.usedflags.append(0) 0287 sortstuff.nameusedflags.append(0) 0288 sortstuff.sortorder.append(0xffff) 0289 sortstuff.addressusedflags.append(0) 0290 sortstuff.memousedflags.append(0) 0291 0292 for i in range(self.protocolclass.MAXNUMBERS): 0293 sortstuff.numusedflags.append(0) 0294 0295 for i in range(self.protocolclass.MAXEMAILS): 0296 sortstuff.emailusedflags.append(0) 0297 0298 for i in range(self.protocolclass.MAXURLS): 0299 sortstuff.urlusedflags.append(0) 0300 0301 groupslotsused=0 0302 for i in range(self.protocolclass.NUMGROUPS): 0303 val=0 0304 if groups.has_key(i): 0305 val=1 0306 groupslotsused+=1 0307 sortstuff.groupslotusedflags.append(val) 0308 0309 namep=0 0310 nump=0 0311 urlp=0 0312 memop=0 0313 addressp=0 0314 emailp=0 0315 slotsused=0 0316 0317 namemap=[] 0318 contactmap=[] 0319 urlmap=[] 0320 0321 pbook=data['phonebook'] # Get converted phonebook 0322 self.log("Putting phone into write mode") 0323 req=self.protocolclass.beginendupdaterequest() 0324 req.beginend=1 # Start update 0325 res=self.sendpbcommand(req, self.protocolclass.beginendupdateresponse, writemode=True) 0326 self.writewait() 0327 keys=pbook.keys() 0328 keys.sort() 0329 sortstuff.slotsused=len(keys) 0330 sortstuff.numemail=0 0331 sortstuff.numurl=0 0332 0333 reqname=self.protocolclass.nameupdaterequest() 0334 reqnumber=self.protocolclass.numberupdaterequest() 0335 reqemail=self.protocolclass.emailupdaterequest() 0336 requrl=self.protocolclass.urlupdaterequest() 0337 reqmemo=self.protocolclass.memoupdaterequest() 0338 reqaddress=self.protocolclass.addressupdaterequest() 0339 0340 for ikey in keys: 0341 ii=pbook[ikey] 0342 #slot=ii['slot'] # Just a constant 0343 slot=slotsused 0344 slotsused+=1 0345 0346 reqindex=self.protocolclass.contactindexupdaterequest() 0347 reqindex.slot=slot 0348 reqindex.entry.slot=slot 0349 0350 name=ii['name'] 0351 self.progress(slotsused-1, sortstuff.slotsused, "Writing "+name) 0352 print "Write "+name+" to "+`slot` 0353 namemap.append((slot,name)) 0354 0355 reqname.slot=namep 0356 reqname.entry.contactp=slot 0357 reqname.entry.name=name 0358 reqname.entry.name_len=ii['name_len'] 0359 reqname.entry.name_len2=ii['name_len'] 0360 res=self.sendpbcommand(reqname, self.protocolclass.nameresponse) 0361 sortstuff.nameusedflags[namep].used=1 0362 reqindex.entry.namep=namep 0363 namep+=1 0364 0365 reqindex.entry.groupid = ii['group'] 0366 0367 0368 # URL 0369 if ii['url']: 0370 print urlp,ii['url'] 0371 requrl.slot=urlp 0372 requrl.entry.contactp=slot 0373 requrl.entry.url=ii['url'] 0374 requrl.entry.url_len=len(ii['url']) 0375 res=self.sendpbcommand(requrl, self.protocolclass.urlresponse) 0376 sortstuff.urlusedflags[urlp].used=1 0377 0378 reqindex.entry.urlp=urlp 0379 urlp+=1 0380 0381 # Memo 0382 if ii['memo']: 0383 print memop,ii['memo'] 0384 reqmemo.slot=memop 0385 reqmemo.entry.contactp=slot 0386 reqmemo.entry.memo=ii['memo'] 0387 reqmemo.entry.memo_len=len(ii['memo']) 0388 res=self.sendpbcommand(reqmemo, self.protocolclass.memoresponse) 0389 sortstuff.memousedflags[memop].used=1 0390 0391 reqindex.entry.memop=memop 0392 memop+=1 0393 0394 # Address 0395 if ii['address']: 0396 print addressp,ii['address'] 0397 reqaddress.slot=addressp 0398 reqaddress.entry.contactp=slot 0399 reqaddress.entry.address=ii['address'] 0400 reqaddress.entry.address_len=len(ii['address']) 0401 res=self.sendpbcommand(reqaddress, self.protocolclass.addressresponse) 0402 sortstuff.addressusedflags[addressp].used=1 0403 0404 reqindex.entry.addressp=addressp 0405 addressp+=1 0406 0407 # Email addresses 0408 for emailindex in range(len(ii['emails'])): 0409 print emailp,ii['emails'][emailindex] 0410 reqemail.slot=emailp 0411 reqemail.entry.contactp=slot 0412 reqemail.entry.email=ii['emails'][emailindex] 0413 reqemail.entry.email_len=len(ii['emails'][emailindex]) 0414 res=self.sendpbcommand(reqemail, self.protocolclass.emailresponse) 0415 sortstuff.emailusedflags[emailp].used=1 0416 0417 reqindex.entry.emailps.append(emailp) 0418 emailp+=1 0419 0420 for numindex in range(len(ii['emails']),self.protocolclass.NUMEMAILS): 0421 reqindex.entry.emailps.append(0xffff) 0422 0423 for numindex in range(len(ii['numbers'])): 0424 print nump,ii['numbers'][numindex],ii['numbertypes'][numindex] 0425 reqnumber.slot=nump 0426 reqnumber.entry.contactp=slot 0427 reqnumber.entry.number=ii['numbers'][numindex] 0428 reqnumber.entry.numberlen=len(ii['numbers'][numindex]) 0429 numbertype=ii['numbertypes'][numindex] 0430 reqnumber.entry.numbertype=numbertype 0431 res=self.sendpbcommand(reqnumber, self.protocolclass.numberresponse) 0432 sortstuff.numusedflags[nump].used=1 0433 reqindex.entry.numberps.append(nump) 0434 speeddial=ii['numberspeeds'][numindex] 0435 if speeddial: 0436 sortstuff.speeddialindex[speeddial-2]=nump 0437 0438 nump+=1 0439 0440 for numindex in range(len(ii['numbers']),self.protocolclass.NUMPHONENUMBERS): 0441 reqindex.entry.numberps.append(0xffff) 0442 0443 0444 res=self.sendpbcommand(reqindex, self.protocolclass.contactindexresponse) 0445 print "Setting slot "+`slot`+" to used" 0446 sortstuff.usedflags[slot].used=1 0447 0448 # Write out the sort buffer 0449 sortstuff.slotsused=slotsused 0450 sortstuff.nameslotsused=slotsused 0451 sortstuff.groupslotsused=groupslotsused 0452 sortstuff.numslotsused=nump 0453 sortstuff.emailslotsused=emailp 0454 sortstuff.num_address=addressp 0455 sortstuff.num_memo=memop 0456 sortstuff.pbfirstletters="" 0457 sortstuff.urlslotsused=urlp 0458 namemap.sort(self.sanyosort) 0459 i=0 0460 for (slot, name) in namemap: 0461 sortstuff.sortorder[i].pbslot=slot 0462 if name: 0463 sortstuff.pbfirstletters+=name[0] 0464 else: 0465 sortstuff.pbfirstletters+=chr(0) 0466 i+=1 0467 0468 self.sendsanyobuffer(sortstuff) 0469 self.progress(1,1, "Phonebook write completed") 0470 data['rebootphone']=1 0471 0472 my_model='SCP6600' 0473 detected_model='SCP-6600/US' 0474 my_manufacturer='SANYO' 0475 0476 parentprofile=com_sanyo3100.Profile 0477 class Profile(parentprofile): 0478 0479 protocolclass=Phone.protocolclass 0480 serialsname=Phone.serialsname 0481 phone_manufacturer=Phone.my_manufacturer 0482 phone_model=Phone.my_model 0483 0484 _supportedsyncs=( 0485 ('phonebook', 'read', None), # all phonebook reading 0486 ('calendar', 'read', None), # all calendar reading 0487 ('phonebook', 'write', 'OVERWRITE'), # only overwriting phonebook 0488 ('calendar', 'write', 'OVERWRITE'), # only overwriting calendar 0489 ('wallpaper', 'read', None), # all wallpaper reading 0490 ('ringtone', 'read', None), # all ringtone reading 0491 ('call_history', 'read', None),# all call history list reading 0492 ('sms', 'read', None), # Read sms messages 0493 ('todo', 'read', None), # Read todos 0494 ) 0495 0496 def __init__(self): 0497 parentprofile.__init__(self) 0498 com_sanyonewer.Profile.__init__(self) 0499 self.numbertypetab=numbertypetab 0500 0501 def _getgroup(self, name, groups): 0502 for key in groups: 0503 if groups[key]['name']==name: 0504 return key,groups[key] 0505 return None,None 0506 0507 def normalisegroups(self, helper, data): 0508 "Assigns groups based on category data" 0509 0510 pad=[] 0511 keys=data['groups'].keys() 0512 keys.sort() 0513 for k in keys: 0514 if k==self.protocolclass.NUMGROUPS: # ignore key 4 which is 'Unassigned' 0515 name=data['groups'][k]['name'] 0516 pad.append(name) 0517 0518 groups=helper.getmostpopularcategories(self.protocolclass.NUMGROUPS, data['phonebook'], ["Unassigned"], 16, pad) 0519 0520 # alpha sort 0521 groups.sort() 0522 0523 # newgroups 0524 newgroups={} 0525 0526 # Unassigned in 0th group (Need to see what # 0527 newgroups[0]={'name': 'Unassigned'} 0528 0529 # populate 0530 for name in groups: 0531 # existing entries keep same key 0532 if name=="Unassigned": continue 0533 key,value=self._getgroup(name, data['groups']) 0534 if key is not None: 0535 newgroups[key]=value 0536 # new entries get whatever numbers are free 0537 for name in groups: 0538 key,value=self._getgroup(name, newgroups) 0539 if key is None: 0540 for key in range(1,self.protocolclass.NUMGROUPS+1): 0541 if key not in newgroups: 0542 newgroups[key]={'name': name, 'icon': 1} 0543 break 0544 0545 # yay, done 0546 if data['groups']!=newgroups: 0547 data['groups']=newgroups 0548 0549 def convertphonebooktophone(self, helper, data): 0550 "Converts the data to what will be used by the phone" 0551 0552 self.normalisegroups(helper, data) 0553 results={} 0554 0555 0556 slotsused={} 0557 pb=data['phonebook'] 0558 for pbentry in pb: 0559 entry=pb[pbentry] 0560 slot=helper.getserial(entry.get('serials', []), self.serialsname, data['uniqueserial'], 'slot', -1) 0561 if(slot >= 0 and slot < self.protocolclass.NUMPHONEBOOKENTRIES): 0562 slotsused[slot]=1 0563 0564 lastunused=0 # One more than last unused slot 0565 0566 for pbentry in pb: 0567 e={} # entry out 0568 entry=pb[pbentry] # entry in 0569 try: 0570 try: 0571 e['name']=helper.getfullname(entry.get('names', []),1,1,32)[0] 0572 except: 0573 e['name']='' 0574 e['name_len']=len(e['name']) 0575 if len(e['name'])==0: 0576 print "Entry with no name" 0577 0578 cat=helper.makeone(helper.getcategory(entry.get('categories',[]),0,1,16), None) 0579 if cat is None: 0580 e['group']=0 0581 else: 0582 key,value=self._getgroup(cat, data['groups']) 0583 if key is not None: 0584 e['group']=key 0585 else: 0586 e['group']=0 0587 0588 serial1=helper.getserial(entry.get('serials', []), self.serialsname, data['uniqueserial'], 'slot', -1) 0589 0590 if(slot >= 0 and slot < self.protocolclass.NUMPHONEBOOKENTRIES): 0591 e['slot']=slot 0592 else: # A new entry. Must find unused slot 0593 while(slotsused.has_key(lastunused)): 0594 lastunused+=1 0595 if(lastunused >= self.protocolclass.NUMPHONEBOOKENTRIES): 0596 raise helper.ConversionFailed() 0597 e['slot']=lastunused 0598 slotsused[lastunused]=1 0599 0600 e['emails']=helper.getemails(entry.get('emails', []),0,self.protocolclass.NUMEMAILS,self.protocolclass.MAXEMAILLEN) 0601 0602 e['url']=helper.makeone(helper.geturls(entry.get('urls', []), 0,1,self.protocolclass.MAXURLLEN), "") 0603 0604 e['memo']=helper.makeone(helper.getmemos(entry.get('memos', []), 0,1,self.protocolclass.MAXMEMOLEN), "") 0605 0606 numbers=helper.getnumbers(entry.get('numbers', []),0,self.protocolclass.NUMPHONENUMBERS) 0607 e['numbertypes']=[] 0608 e['numbers']=[] 0609 e['numberspeeds']=[] 0610 0611 for numindex in range(len(numbers)): 0612 num=numbers[numindex] 0613 type=num['type'] 0614 numtype=len(self.numbertypetab) # None type is default 0615 for i,t in enumerate(self.numbertypetab): 0616 if type==t: 0617 numtype=i+1 0618 break 0619 # If type not found, give it "none" type 0620 e['numbertypes'].append(numtype) 0621 0622 # Need to enforce phone number length limit 0623 number=self.phonize(num['number']) 0624 e['numbers'].append(number) 0625 0626 # deal with speed dial 0627 sd=num.get("speeddial", 0xFF) 0628 if sd>=self.protocolclass.FIRSTSPEEDDIAL and sd<=self.protocolclass.LASTSPEEDDIAL: 0629 e['numberspeeds'].append(sd) 0630 else: 0631 e['numberspeeds'].append(0) 0632 0633 #e['numberspeeds']=helper.filllist(e['numberspeeds'], self.protocolclass.NUMPHONENUMBERS, 0xFF) 0634 #e['numbertypes']=helper.filllist(e['numbertypes'], self.protocolclass.NUMPHONENUMBERS, 0) 0635 #e['numbers']=helper.filllist(e['numbers'], self.protocolclass.NUMPHONENUMBERS, "") 0636 0637 # Need to write a helper 0638 e['address']=None 0639 addresses=entry.get('addresses', []) 0640 if addresses: 0641 e['address']=helper.getflag(addresses,'company','')+";"+helper.getflag(addresses,'street','')+";"+helper.getflag(addresses,'street2','')+";"+helper.getflag(addresses,'city','')+";"+helper.getflag(addresses,'state','')+";"+helper.getflag(addresses,'postalcode','')+";"+helper.getflag(addresses,'country','') 0642 0643 e['ringtone']=helper.getringtone(entry.get('ringtones', []), 'call', None) 0644 e['wallpaper']=helper.getwallpaper(entry.get('wallpapers', []), 'call', None) 0645 0646 e['secret']=helper.getflag(entry.get('flags', []), 'secret', False) 0647 results[pbentry]=e 0648 0649 except helper.ConversionFailed: 0650 #self.log("No Free Slot for "+e['name']) 0651 print "No Free Slot for "+e['name'] 0652 continue 0653 0654 data['phonebook']=results 0655 return data 0656
Generated by PyXR 0.9.4