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

Source Code for Module phones.com_sanyo6600

  1  ### BITPIM 
  2  ### 
  3  ### Copyright (C) 2006 Stephen Wood <sawecw@users.sf.net> 
  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_sanyo6600.py 4531 2007-12-28 04:23:09Z sawecw $ 
  9   
 10  """Talk to the Sanyo Katana (SCP-6600) cell phone""" 
 11  # standard modules 
 12  import re 
 13  import time 
 14  import sha 
 15   
 16  # my modules 
 17  import common 
 18  import helpids 
 19  import p_brew 
 20  import p_sanyo8300 
 21  import p_sanyo4930 
 22  import p_sanyo6600 
 23  import com_brew 
 24  import com_phone 
 25  import com_sanyo 
 26  import com_sanyomedia 
 27  import com_sanyonewer 
 28  import com_sanyo3100 
 29  import prototypes 
 30  import bpcalendar 
 31   
 32  numbertypetab=( 'cell', 'home', 'office', 'pager', 
 33                      'fax', 'none') 
 34   
35 -class Phone(com_sanyo3100.Phone):
36 "Talk to the Sanyo Katana (SCP-6600) cell phone" 37 38 desc="SCP-6600" 39 helpid=helpids.ID_PHONE_SANYOSCP6600 40 41 FIRST_MEDIA_DIRECTORY=1 42 LAST_MEDIA_DIRECTORY=2 43 44 imagelocations=( 45 # offset, directory #, indexflag, type, maximumentries 46 ) 47 wallpaperexts=(".jpg", ".png", ".mp4", ".3g2",".JPG") 48 49 50 protocolclass=p_sanyo6600 51 serialsname='scp6600' 52 53 builtinringtones=( 'None', 'Vibrate', '', '', '', '', '', '', '', 54 'Tone 1', 'Tone 2', 'Tone 3', 'Tone 4', 'Tone 5', 55 'Tone 6', 'Tone 7', 'Tone 8', '', '', '', '', '', 56 '', '', '', '', 57 'Requiem:Dies Irae', 'Minute Waltz', 'Hungarian Dance', 58 'Military March', 'Ten Little Indians', 59 'Head,Shoulders,Knees&Toes', 'The Moment', 'Asian Jingle', 60 'Kung-fu','','','','','','','','','','','','','','','','','', 61 '','','','','','', 62 'Voice Alarm') 63 64 65 # f1ff None 65521 66 # FFF2: Vibrate 65522 67 # pb cal 68 # Tone 1: 33 43 69 # Requium: 60 60 70 # Kung Fu: 68 71 # Download: 135 72 calendar_defaultringtone=0 73 calendar_defaultcaringtone=0 74 calendar_toneoffset=33 75 calendar_tonerange=xrange(4,100) 76
77 - def __init__(self, logtarget, commport):
78 com_sanyo3100.Phone.__init__(self, logtarget, commport) 79 self.mode=self.MODENONE 80 self.numbertypetab=numbertypetab
81
82 - def getfundamentals(self, results):
83 """Gets information fundamental to interopating with the phone and UI.""" 84 results['uniqueserial']=sha.new(self.get_esn()).hexdigest() 85 self.getmediaindices(results) 86 87 results['groups']=self.read_groups() 88 89 self.log("Fundamentals retrieved") 90 91 return results
92
93 - def read_groups(self):
94 g={} 95 96 req=self.protocolclass.grouprequest() 97 for slot in range(1,self.protocolclass.NUMGROUPS+1): 98 req.slot = slot 99 res=self.sendpbcommand(req, self.protocolclass.groupresponse) 100 if res.entry.groupname_len: 101 g[slot]={'name': res.entry.groupname} 102 return g
103
104 - def savegroups(self, data):
105 """Write the groups, sending only those groups that have had 106 a name change. (So that ringers don't get messed up)""" 107 groups=data['groups'] 108 109 groups_onphone=self.read_groups() # Get groups on phone 110 111 # If groups read doesn't work, don't try to write groups 112 if not groups_onphone: 113 return 114 115 keys=groups.keys() 116 keys.sort() 117 print "Bitpim group keys",keys 118 print "Onphone group keys",groups_onphone.keys() 119 120 for k in keys: 121 if groups[k]['name']!="Unassigned": 122 if not groups_onphone.has_key(k) \ 123 or groups[k]['name']!=groups_onphone[k]['name']: 124 print "Wrinting ",groups[k]['name']," to ",k 125 req=self.protocolclass.groupupdaterequest() 126 req.slot=k 127 req.entry.slot=k 128 req.entry.groupname=groups[k]['name'] 129 req.entry.groupname_len=len(groups[k]['name']) 130 self.sendpbcommand(req, self.protocolclass.groupresponse) 131 groups_onphone[k]=groups[k] 132 data['groups']=groups_onphone
133
134 - def xgetmediaindices(self, results):
135 "Just index builtin media for now." 136 137 com_sanyo.SanyoPhonebook.getmediaindices(self, results) 138 ringermedia=results['ringtone-index'] 139 imagemedia=results['wallpaper-index'] 140 141 results['ringtone-index']=ringermedia 142 results['wallpaper-index']=imagemedia 143 return
144
145 - def getphonebook(self, result):
146 "Code to retrieve packets we have discovered so far so we can work out their formats." 147 pbook={} 148 149 sortstuff = self.getsanyobuffer(self.protocolclass.pbsortbuffer) 150 151 speedslot=[] 152 for i in range(self.protocolclass._NUMSPEEDDIALS): 153 speedslot.append(sortstuff.speeddialindex[i].numslot) 154 155 numentries=sortstuff.slotsused 156 self.log("There are %d entries" % (numentries,)) 157 158 count = 0 # Number of phonebook entries 159 numcount = 0 # Number of phone numbers 160 numemail = 0 # Number of emails 161 numurl = 0 # Number of urls 162 163 self.log(`sortstuff.groupslotsused`+" Groups") 164 self.log(`sortstuff.slotsused`+" Contacts") 165 self.log(`sortstuff.nameslotsused`+" Names") 166 self.log(`sortstuff.numslotsused`+" Phone numbers") 167 self.log(`sortstuff.emailslotsused`+" Email addresses") 168 self.log(`sortstuff.urlslotsused`+" URLs") 169 self.log(`sortstuff.num_address`+" Addresses") 170 self.log(`sortstuff.num_memo`+" Memos") 171 numentries=sortstuff.slotsused 172 173 reqindex=self.protocolclass.contactindexrequest() 174 reqname=self.protocolclass.namerequest() 175 reqnumber=self.protocolclass.numberrequest() 176 reqemail=self.protocolclass.emailrequest() 177 requrl=self.protocolclass.urlrequest() 178 reqmemo=self.protocolclass.memorequest() 179 reqaddress=self.protocolclass.addressrequest() 180 for slot in range(self.protocolclass.NUMPHONEBOOKENTRIES): 181 if sortstuff.usedflags[slot].used: 182 entry={} 183 reqindex.slot=slot 184 resindex=self.sendpbcommand(reqindex,self.protocolclass.contactindexresponse) 185 ringerid = resindex.entry.ringerid 186 pictureid = resindex.entry.pictureid 187 groupid = resindex.entry.groupid 188 189 if resindex.entry.namep>=0 and resindex.entry.namep<self.protocolclass.NUMPHONEBOOKENTRIES: 190 191 reqname.slot = resindex.entry.namep 192 resname=self.sendpbcommand(reqname,self.protocolclass.nameresponse) 193 name=resname.entry.name 194 self.log(name) 195 else: 196 name="" 197 self.log("No Name") 198 print name,ringerid,pictureid 199 200 cat=result['groups'].get(groupid, {'name': "Unassigned"})['name'] 201 if cat != 'Unassigned': 202 entry['categories']=[ {'category': cat} ] 203 entry['serials']=[ {'sourcetype': self.serialsname, 204 205 'slot': slot, 206 'sourceuniqueid': result['uniqueserial']} ] 207 entry['names']=[ {'full': name} ] 208 if resindex.entry.secret: 209 entry['flags']=[{'secret': True}] 210 entry['numbers']=[] 211 for numi in range(self.protocolclass.NUMPHONENUMBERS): 212 nump=resindex.entry.numberps[numi].slot 213 if nump < self.protocolclass.MAXNUMBERS: 214 reqnumber.slot=nump 215 resnumber=self.sendpbcommand(reqnumber,self.protocolclass.numberresponse) 216 numhash={'number':resnumber.entry.number, 'type': self.numbertypetab[resnumber.entry.numbertype-1]} 217 for j in range(len(speedslot)): 218 if(speedslot[j]==nump): 219 numhash['speeddial']=j+2 220 break 221 if resindex.entry.defaultnum==numi: 222 entry['numbers'].insert(0,numhash) 223 else: 224 entry['numbers'].append(numhash) 225 226 urlp=resindex.entry.urlp 227 if urlp<self.protocolclass.MAXURLS: 228 requrl.slot=urlp 229 resurl=self.sendpbcommand(requrl,self.protocolclass.urlresponse) 230 entry['urls']=[ {'url': resurl.entry.url} ] 231 memop=resindex.entry.memop 232 if memop<self.protocolclass.MAXMEMOS: 233 reqmemo.slot=memop 234 resmemo=self.sendpbcommand(reqmemo,self.protocolclass.memoresponse) 235 self.log("Memo: "+resmemo.entry.memo) 236 entry['memos']=[ {'memo': resmemo.entry.memo} ] 237 addressp=resindex.entry.addressp 238 if addressp<self.protocolclass.MAXADDRESSES: 239 reqaddress.slot=addressp 240 resaddress=self.sendpbcommand(reqaddress,self.protocolclass.addressresponse) 241 # Need to parse this address for phonebook.py 242 self.log("Address: "+resaddress.entry.address) 243 entry['addresses']=[ {'street': resaddress.entry.address} ] 244 entry['emails']=[] 245 for emaili in range(self.protocolclass.NUMEMAILS): 246 emaili=resindex.entry.emailps[emaili].slot 247 if emaili < self.protocolclass.MAXEMAILS: 248 reqemail.slot=emaili 249 resemail=self.sendpbcommand(reqemail,self.protocolclass.emailresponse) 250 self.log("Email: "+resemail.entry.email) 251 entry['emails'].append({'email': resemail.entry.email}) 252 253 pbook[count]=entry 254 self.progress(count, numentries, name) 255 count+=1 256 numcount+=len(entry['numbers']) 257 if entry.has_key('emails'): 258 numemail+=len(entry['emails']) 259 if entry.has_key('urls'): 260 numurl+=len(entry['urls']) 261 262 263 self.progress(numentries, numentries, "Phone book read completed") 264 self.log("Phone contains "+`count`+" contacts, "+`numcount`+" phone numbers, "+`numemail`+" Emails, "+`numurl`+" URLs") 265 result['phonebook']=pbook 266 cats=[] 267 for i in result['groups']: 268 cats.append(result['groups'][i]['name']) 269 result['categories']=cats 270 return pbook
271
272 - def savephonebook(self, data):
273 newphonebook={} 274 self.setmode(self.MODEBREW) 275 self.setmode(self.MODEPHONEBOOK) 276 277 sortstuff=self.protocolclass.pbsortbuffer() 278 279 self.savegroups(data) 280 groups=data['groups'] 281 282 for i in range(self.protocolclass._NUMSPEEDDIALS): 283 sortstuff.speeddialindex.append(0xffff) 284 285 for i in range(self.protocolclass.NUMPHONEBOOKENTRIES): 286 sortstuff.usedflags.append(0) 287 sortstuff.nameusedflags.append(0) 288 sortstuff.sortorder.append(0xffff) 289 sortstuff.addressusedflags.append(0) 290 sortstuff.memousedflags.append(0) 291 292 for i in range(self.protocolclass.MAXNUMBERS): 293 sortstuff.numusedflags.append(0) 294 295 for i in range(self.protocolclass.MAXEMAILS): 296 sortstuff.emailusedflags.append(0) 297 298 for i in range(self.protocolclass.MAXURLS): 299 sortstuff.urlusedflags.append(0) 300 301 groupslotsused=0 302 for i in range(self.protocolclass.NUMGROUPS): 303 val=0 304 if groups.has_key(i): 305 val=1 306 groupslotsused+=1 307 sortstuff.groupslotusedflags.append(val) 308 309 namep=0 310 nump=0 311 urlp=0 312 memop=0 313 addressp=0 314 emailp=0 315 slotsused=0 316 317 namemap=[] 318 contactmap=[] 319 urlmap=[] 320 321 pbook=data['phonebook'] # Get converted phonebook 322 self.log("Putting phone into write mode") 323 req=self.protocolclass.beginendupdaterequest() 324 req.beginend=1 # Start update 325 res=self.sendpbcommand(req, self.protocolclass.beginendupdateresponse, writemode=True) 326 self.writewait() 327 keys=pbook.keys() 328 keys.sort() 329 sortstuff.slotsused=len(keys) 330 sortstuff.numemail=0 331 sortstuff.numurl=0 332 333 reqname=self.protocolclass.nameupdaterequest() 334 reqnumber=self.protocolclass.numberupdaterequest() 335 reqemail=self.protocolclass.emailupdaterequest() 336 requrl=self.protocolclass.urlupdaterequest() 337 reqmemo=self.protocolclass.memoupdaterequest() 338 reqaddress=self.protocolclass.addressupdaterequest() 339 340 for ikey in keys: 341 ii=pbook[ikey] 342 #slot=ii['slot'] # Just a constant 343 slot=slotsused 344 slotsused+=1 345 346 reqindex=self.protocolclass.contactindexupdaterequest() 347 reqindex.slot=slot 348 reqindex.entry.slot=slot 349 350 name=ii['name'] 351 self.progress(slotsused-1, sortstuff.slotsused, "Writing "+name) 352 print "Write "+name+" to "+`slot` 353 namemap.append((slot,name)) 354 355 reqname.slot=namep 356 reqname.entry.contactp=slot 357 reqname.entry.name=name 358 reqname.entry.name_len=ii['name_len'] 359 reqname.entry.name_len2=ii['name_len'] 360 res=self.sendpbcommand(reqname, self.protocolclass.nameresponse) 361 sortstuff.nameusedflags[namep].used=1 362 reqindex.entry.namep=namep 363 namep+=1 364 365 reqindex.entry.groupid = ii['group'] 366 367 368 # URL 369 if ii['url']: 370 print urlp,ii['url'] 371 requrl.slot=urlp 372 requrl.entry.contactp=slot 373 requrl.entry.url=ii['url'] 374 requrl.entry.url_len=len(ii['url']) 375 res=self.sendpbcommand(requrl, self.protocolclass.urlresponse) 376 sortstuff.urlusedflags[urlp].used=1 377 378 reqindex.entry.urlp=urlp 379 urlp+=1 380 381 # Memo 382 if ii['memo']: 383 print memop,ii['memo'] 384 reqmemo.slot=memop 385 reqmemo.entry.contactp=slot 386 reqmemo.entry.memo=ii['memo'] 387 reqmemo.entry.memo_len=len(ii['memo']) 388 res=self.sendpbcommand(reqmemo, self.protocolclass.memoresponse) 389 sortstuff.memousedflags[memop].used=1 390 391 reqindex.entry.memop=memop 392 memop+=1 393 394 # Address 395 if ii['address']: 396 print addressp,ii['address'] 397 reqaddress.slot=addressp 398 reqaddress.entry.contactp=slot 399 reqaddress.entry.address=ii['address'] 400 reqaddress.entry.address_len=len(ii['address']) 401 res=self.sendpbcommand(reqaddress, self.protocolclass.addressresponse) 402 sortstuff.addressusedflags[addressp].used=1 403 404 reqindex.entry.addressp=addressp 405 addressp+=1 406 407 # Email addresses 408 for emailindex in range(len(ii['emails'])): 409 print emailp,ii['emails'][emailindex] 410 reqemail.slot=emailp 411 reqemail.entry.contactp=slot 412 reqemail.entry.email=ii['emails'][emailindex] 413 reqemail.entry.email_len=len(ii['emails'][emailindex]) 414 res=self.sendpbcommand(reqemail, self.protocolclass.emailresponse) 415 sortstuff.emailusedflags[emailp].used=1 416 417 reqindex.entry.emailps.append(emailp) 418 emailp+=1 419 420 for numindex in range(len(ii['emails']),self.protocolclass.NUMEMAILS): 421 reqindex.entry.emailps.append(0xffff) 422 423 for numindex in range(len(ii['numbers'])): 424 print nump,ii['numbers'][numindex],ii['numbertypes'][numindex] 425 reqnumber.slot=nump 426 reqnumber.entry.contactp=slot 427 reqnumber.entry.number=ii['numbers'][numindex] 428 reqnumber.entry.numberlen=len(ii['numbers'][numindex]) 429 numbertype=ii['numbertypes'][numindex] 430 reqnumber.entry.numbertype=numbertype 431 res=self.sendpbcommand(reqnumber, self.protocolclass.numberresponse) 432 sortstuff.numusedflags[nump].used=1 433 reqindex.entry.numberps.append(nump) 434 speeddial=ii['numberspeeds'][numindex] 435 if speeddial: 436 sortstuff.speeddialindex[speeddial-2]=nump 437 438 nump+=1 439 440 for numindex in range(len(ii['numbers']),self.protocolclass.NUMPHONENUMBERS): 441 reqindex.entry.numberps.append(0xffff) 442 443 444 res=self.sendpbcommand(reqindex, self.protocolclass.contactindexresponse) 445 print "Setting slot "+`slot`+" to used" 446 sortstuff.usedflags[slot].used=1 447 448 # Write out the sort buffer 449 sortstuff.slotsused=slotsused 450 sortstuff.nameslotsused=slotsused 451 sortstuff.groupslotsused=groupslotsused 452 sortstuff.numslotsused=nump 453 sortstuff.emailslotsused=emailp 454 sortstuff.num_address=addressp 455 sortstuff.num_memo=memop 456 sortstuff.pbfirstletters="" 457 sortstuff.urlslotsused=urlp 458 namemap.sort(self.sanyosort) 459 i=0 460 for (slot, name) in namemap: 461 sortstuff.sortorder[i].pbslot=slot 462 if name: 463 sortstuff.pbfirstletters+=name[0] 464 else: 465 sortstuff.pbfirstletters+=chr(0) 466 i+=1 467 468 self.sendsanyobuffer(sortstuff) 469 self.progress(1,1, "Phonebook write completed") 470 data['rebootphone']=1
471 472 my_model='SCP6600' 473 detected_model='SCP-6600/US' 474 my_manufacturer='SANYO'
475 476 parentprofile=com_sanyo3100.Profile
477 -class Profile(parentprofile):
478 479 protocolclass=Phone.protocolclass 480 serialsname=Phone.serialsname 481 phone_manufacturer=Phone.my_manufacturer 482 phone_model=Phone.my_model 483 484 _supportedsyncs=( 485 ('phonebook', 'read', None), # all phonebook reading 486 ('calendar', 'read', None), # all calendar reading 487 ('phonebook', 'write', 'OVERWRITE'), # only overwriting phonebook 488 ('calendar', 'write', 'OVERWRITE'), # only overwriting calendar 489 ('wallpaper', 'read', None), # all wallpaper reading 490 ('ringtone', 'read', None), # all ringtone reading 491 ('call_history', 'read', None),# all call history list reading 492 ('sms', 'read', None), # Read sms messages 493 ('todo', 'read', None), # Read todos 494 ) 495
496 - def __init__(self):
497 parentprofile.__init__(self) 498 com_sanyonewer.Profile.__init__(self) 499 self.numbertypetab=numbertypetab
500
501 - def _getgroup(self, name, groups):
502 for key in groups: 503 if groups[key]['name']==name: 504 return key,groups[key] 505 return None,None
506
507 - def normalisegroups(self, helper, data):
508 "Assigns groups based on category data" 509 510 pad=[] 511 keys=data['groups'].keys() 512 keys.sort() 513 for k in keys: 514 if k==self.protocolclass.NUMGROUPS: # ignore key 4 which is 'Unassigned' 515 name=data['groups'][k]['name'] 516 pad.append(name) 517 518 groups=helper.getmostpopularcategories(self.protocolclass.NUMGROUPS, data['phonebook'], ["Unassigned"], 16, pad) 519 520 # alpha sort 521 groups.sort() 522 523 # newgroups 524 newgroups={} 525 526 # Unassigned in 0th group (Need to see what # 527 newgroups[0]={'name': 'Unassigned'} 528 529 # populate 530 for name in groups: 531 # existing entries keep same key 532 if name=="Unassigned": continue 533 key,value=self._getgroup(name, data['groups']) 534 if key is not None: 535 newgroups[key]=value 536 # new entries get whatever numbers are free 537 for name in groups: 538 key,value=self._getgroup(name, newgroups) 539 if key is None: 540 for key in range(1,self.protocolclass.NUMGROUPS+1): 541 if key not in newgroups: 542 newgroups[key]={'name': name, 'icon': 1} 543 break 544 545 # yay, done 546 if data['groups']!=newgroups: 547 data['groups']=newgroups
548
549 - def convertphonebooktophone(self, helper, data):
550 "Converts the data to what will be used by the phone" 551 552 self.normalisegroups(helper, data) 553 results={} 554 555 556 slotsused={} 557 pb=data['phonebook'] 558 for pbentry in pb: 559 entry=pb[pbentry] 560 slot=helper.getserial(entry.get('serials', []), self.serialsname, data['uniqueserial'], 'slot', -1) 561 if(slot >= 0 and slot < self.protocolclass.NUMPHONEBOOKENTRIES): 562 slotsused[slot]=1 563 564 lastunused=0 # One more than last unused slot 565 566 for pbentry in pb: 567 e={} # entry out 568 entry=pb[pbentry] # entry in 569 try: 570 try: 571 e['name']=helper.getfullname(entry.get('names', []),1,1,32)[0] 572 except: 573 e['name']='' 574 e['name_len']=len(e['name']) 575 if len(e['name'])==0: 576 print "Entry with no name" 577 578 cat=helper.makeone(helper.getcategory(entry.get('categories',[]),0,1,16), None) 579 if cat is None: 580 e['group']=0 581 else: 582 key,value=self._getgroup(cat, data['groups']) 583 if key is not None: 584 e['group']=key 585 else: 586 e['group']=0 587 588 serial1=helper.getserial(entry.get('serials', []), self.serialsname, data['uniqueserial'], 'slot', -1) 589 590 if(slot >= 0 and slot < self.protocolclass.NUMPHONEBOOKENTRIES): 591 e['slot']=slot 592 else: # A new entry. Must find unused slot 593 while(slotsused.has_key(lastunused)): 594 lastunused+=1 595 if(lastunused >= self.protocolclass.NUMPHONEBOOKENTRIES): 596 raise helper.ConversionFailed() 597 e['slot']=lastunused 598 slotsused[lastunused]=1 599 600 e['emails']=helper.getemails(entry.get('emails', []),0,self.protocolclass.NUMEMAILS,self.protocolclass.MAXEMAILLEN) 601 602 e['url']=helper.makeone(helper.geturls(entry.get('urls', []), 0,1,self.protocolclass.MAXURLLEN), "") 603 604 e['memo']=helper.makeone(helper.getmemos(entry.get('memos', []), 0,1,self.protocolclass.MAXMEMOLEN), "") 605 606 numbers=helper.getnumbers(entry.get('numbers', []),0,self.protocolclass.NUMPHONENUMBERS) 607 e['numbertypes']=[] 608 e['numbers']=[] 609 e['numberspeeds']=[] 610 611 for numindex in range(len(numbers)): 612 num=numbers[numindex] 613 type=num['type'] 614 numtype=len(self.numbertypetab) # None type is default 615 for i,t in enumerate(self.numbertypetab): 616 if type==t: 617 numtype=i+1 618 break 619 # If type not found, give it "none" type 620 e['numbertypes'].append(numtype) 621 622 # Need to enforce phone number length limit 623 number=self.phonize(num['number']) 624 e['numbers'].append(number) 625 626 # deal with speed dial 627 sd=num.get("speeddial", 0xFF) 628 if sd>=self.protocolclass.FIRSTSPEEDDIAL and sd<=self.protocolclass.LASTSPEEDDIAL: 629 e['numberspeeds'].append(sd) 630 else: 631 e['numberspeeds'].append(0) 632 633 #e['numberspeeds']=helper.filllist(e['numberspeeds'], self.protocolclass.NUMPHONENUMBERS, 0xFF) 634 #e['numbertypes']=helper.filllist(e['numbertypes'], self.protocolclass.NUMPHONENUMBERS, 0) 635 #e['numbers']=helper.filllist(e['numbers'], self.protocolclass.NUMPHONENUMBERS, "") 636 637 # Need to write a helper 638 e['address']=None 639 addresses=entry.get('addresses', []) 640 if addresses: 641 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','') 642 643 e['ringtone']=helper.getringtone(entry.get('ringtones', []), 'call', None) 644 e['wallpaper']=helper.getwallpaper(entry.get('wallpapers', []), 'call', None) 645 646 e['secret']=helper.getflag(entry.get('flags', []), 'secret', False) 647 results[pbentry]=e 648 649 except helper.ConversionFailed: 650 #self.log("No Free Slot for "+e['name']) 651 print "No Free Slot for "+e['name'] 652 continue 653 654 data['phonebook']=results 655 return data
656