Package phones ::
Module com_sanyo6600
|
|
1
2
3
4
5
6
7
8
9
10 """Talk to the Sanyo Katana (SCP-6600) cell phone"""
11
12 import re
13 import time
14 import sha
15
16
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
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
66
67
68
69
70
71
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):
81
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
103
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()
110
111
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
144
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
159 numcount = 0
160 numemail = 0
161 numurl = 0
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
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
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']
322 self.log("Putting phone into write mode")
323 req=self.protocolclass.beginendupdaterequest()
324 req.beginend=1
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
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
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
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
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
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
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
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),
486 ('calendar', 'read', None),
487 ('phonebook', 'write', 'OVERWRITE'),
488 ('calendar', 'write', 'OVERWRITE'),
489 ('wallpaper', 'read', None),
490 ('ringtone', 'read', None),
491 ('call_history', 'read', None),
492 ('sms', 'read', None),
493 ('todo', 'read', None),
494 )
495
500
506
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:
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
521 groups.sort()
522
523
524 newgroups={}
525
526
527 newgroups[0]={'name': 'Unassigned'}
528
529
530 for name in groups:
531
532 if name=="Unassigned": continue
533 key,value=self._getgroup(name, data['groups'])
534 if key is not None:
535 newgroups[key]=value
536
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
546 if data['groups']!=newgroups:
547 data['groups']=newgroups
548
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
565
566 for pbentry in pb:
567 e={}
568 entry=pb[pbentry]
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:
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)
615 for i,t in enumerate(self.numbertypetab):
616 if type==t:
617 numtype=i+1
618 break
619
620 e['numbertypes'].append(numtype)
621
622
623 number=self.phonize(num['number'])
624 e['numbers'].append(number)
625
626
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
634
635
636
637
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
651 print "No Free Slot for "+e['name']
652 continue
653
654 data['phonebook']=results
655 return data
656