PyXR

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



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