Package phones ::
Module com_samsungspha840_telus
|
|
1
2
3
4
5
6
7
8
9
10
11
12 """Communicate with a Samsung SPH-A840 from Telus Canada"""
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 import time
51 import datetime
52
53 import sha
54 import re
55 import struct
56
57 import bpcalendar
58 import prototypes
59 import todo
60 import memo
61
62 import common
63 import commport
64 import p_brew
65 import p_samsungspha840_telus
66 import com_brew
67 import com_phone
68 import com_samsung_packet
69 import helpids
70
71 numbertypetab=('home','office','cell','pager','fax')
72
73
74
75
76 parentphone=com_samsung_packet.Phone
78 "Talk to a Samsung SPH-A840 phone (Telus)"
79
80 __read_timeout=0.5
81 __cal_end_datetime_value=None
82 __cal_alarm_values={0: -1, 1: 0, 2: 10, 3: 30, 4: 60 }
83 __cal_max_name_len=32
84 _cal_max_events_per_day=5
85
86 desc="SPH-A840 (Telus)"
87 helpid=helpids.ID_PHONE_SAMSUNGOTHERS
88 protocolclass=p_samsungspha840_telus
89 serialsname='spha840T'
90
91 builtin_ringtones=(
92 (0, ['Default Tone']),
93 (1, ['Ring %02d'%x for x in range(1, 6)]),
94 (6, ['Melody %02d'%x for x in range(1, 6)]),
95 )
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 builtin_pictures=(
112 (0, ['Human %02d'%x for x in range(1, 21)]),
113 (30, ['Animal %02d'%x for x in range(1, 16)]),
114 (60, ['Other %02d'%x for x in range(1, 11)]),
115 (80, ['On Phone Image']),
116 )
117
118 - def __init__(self, logtarget, commport):
122
124 """Gets information fundamental to interoperating with the phone and UI."""
125
126 self.log("Retrieving fundamental phone information")
127 self.log("Phone serial number")
128 self.setmode(self.MODEMODEM)
129 results['uniqueserial']=sha.new(self.get_esn()).hexdigest()
130
131 self.log("Setting up Built in Ring Tone index")
132 results['ringtone-index']=self._get_builtin_index(self.builtin_ringtones)
133
134 self.log("Setting up Built in Wallpaper index")
135 results['wallpaper-index']=self.get_wallpaper_index()
136 self.log("Ignoring Corrupted Phone group information")
137
138 results['groups']=self.read_groups()
139 self.log("Fundamentals retrieved")
140 return results
141
143 _res={}
144 for _starting_idx,_list in builtin_list:
145 _idx=_starting_idx
146 for _entry in _list:
147 _res[_idx]={ 'name': _entry,
148 'origin': 'builtin' }
149 _idx+=1
150 return _res
151
155
157 "Extend incomplete lines"
158 nfields=24
159 ncommas=self.countcommas(line)
160 if ncommas<0:
161 line+='"'
162 ncommas = -ncommas
163 if nfields-ncommas>1:
164 line=line+","*(nfields-ncommas-1)
165 return line
166
168 inquote=False
169 ncommas=0
170 for c in line:
171 if c == '"':
172 inquote = not inquote
173 elif not inquote and c == ',':
174 ncommas+=1
175 if inquote:
176 ncommas = -ncommas
177 return ncommas
178
180 raise NotImplementedError()
181
183 raise NotImplementedError()
184
186 raise NotImplementedError()
187
189 raise NotImplementedError()
190
192
193
194
195 g={}
196 g[0]={'name': "Friends"}
197 g[1]={'name': "Business"}
198 g[2]={'name': "Family"}
199 g[3]={'name': "General"}
200 g[4]={'name': "No Group"}
201 return g
202
203
205 """This phone doesn't save or read groups properly
206 so we are skipping the save"""
207 return
208
209
210
211
212
213
214
215
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233 _wp_index=fundamentals.get('wallpaper-index', {})
234 if entry.wallpaper==8:
235 return
236 if entry.wallpaper in (0,1,2,6,7):
237 wallpaper_index=80
238 if entry.wallpaper==3:
239 wallpaper_index=entry.wallpaper_modifier
240 if entry.wallpaper==4:
241 wallpaper_index=30+entry.wallpaper_modifier
242 if entry.wallpaper==5:
243 wallpaper_index=60+entry.wallpaper_modifier
244
245 _wp_name=_wp_index.get(wallpaper_index, {}).get('name', None)
246 if _wp_name:
247 res['wallpapers']=[{ 'wallpaper': _wp_name, 'use': 'call' }]
248
249
250
251
252
253
255 _rt_index=fundamentals.get('ringtone-index', {})
256 _rt_name=_rt_index.get(entry.ringtone, {}).get('name', None)
257 if _rt_name:
258 res['ringtones']=[{ 'ringtone': _rt_name, 'use': 'call' }]
259
260
261
262
263
264
266 res={}
267 res['serials']=[ {'sourcetype': self.serialsname,
268 'slot': entry.slot,
269 'sourceuniqueid': fundamentals['uniqueserial']} ]
270
271 res['names']=[ {'full': entry.name} ]
272
273 cat=fundamentals['groups'].get(entry.group, {'name': "Unassigned"})['name']
274 if cat!="Unassigned":
275 res['categories']=[ {'category': cat} ]
276
277 if len(entry.email):
278 res['emails']=[ {'email': entry.email} ]
279
280 if len(entry.url):
281 res['urls']=[ {'url': entry.url} ]
282 res['numbers']=[]
283 secret=0
284 speeddialtype=entry.speeddial
285 speeddial_has_been_set=0
286 numberindex=0
287 for type in self.numbertypetab:
288 if len(entry.numbers[numberindex].number):
289 numhash={'number': entry.numbers[numberindex].number, 'type': type }
290
291
292 self.log("ENTRY -speeddial : "+str(speeddialtype)+" -index : "+str(numberindex)+" -uslot : "+str(entry.slot))
293
294
295 if speeddial_has_been_set==0:
296 numhash['speeddial']=entry.uslot
297 speeddial_has_been_set=1
298 if speeddialtype==numberindex:
299 numhash['speeddial']=entry.uslot
300 speeddial_has_been_set=1
301 self.log("EXIT -speeddial : "+str(speeddialtype)+" -index : "+str(numberindex)+" -uslot : "+str(entry.slot))
302 res['numbers'].append(numhash)
303 numberindex+=1
304
305
306
307 res['flags']=[ {'secret': secret} ]
308 _args=(res, entry, fundamentals)
309 self._extract_wallpaper(*_args)
310 self._extract_ringtone(*_args)
311 return res
312
313
314
315
316
317
345
346
347
348
349
350
351 - def makeentry(self, entry, data):
352 e=self.protocolclass.pbentry()
353 for k in entry:
354
355 if k=='numbertypes' or k=='secrets':
356 continue
357
358 if k=='ringtone':
359 _rt_index=data.get('ringtone-index', {})
360 for rgt in _rt_index.keys():
361 _rt_name=_rt_index.get(rgt, {}).get('name', None)
362 if _rt_name==entry['ringtone']:
363 e.ringtone=rgt
364 continue
365
366 elif k=='wallpaper':
367
368 e.wallpaper=8
369 e.wallpaper_modifier=0
370 e.wallpaper_file=""
371
372 _wp_index=data.get('wallpaper-index', {})
373 for wpn in _wp_index.keys():
374 _wp_name=_wp_index.get(wpn, {}).get('name', None)
375 if _wp_name==entry['wallpaper']:
376 if wpn<30:
377 e.wallpaper=3
378 e.wallpaper_modifier=wpn
379 if wpn>29 and wpn<60:
380 e.wallpaper=4
381 e.wallpaper_modifier=wpn-30
382 if wpn>59 and wpn<80:
383 e.wallpaper=5
384 e.wallpaper_modifier=wpn-60
385 if wpn==80:
386 e.wallpaper=8
387 e.wallpaper_modifier=8
388 continue
389 elif k=='numbers':
390 for numberindex in range(self.protocolclass.NUMPHONENUMBERS):
391 enpn=self.protocolclass.phonenumber()
392 e.numbers.append(enpn)
393 for i in range(len(entry[k])):
394 numberindex=entry['numbertypes'][i]
395 e.numbers[numberindex].number=entry[k][i]
396
397 e.numbers[numberindex].secret=0
398 continue
399
400 setattr(e, k, entry[k])
401
402 return e
403
404
405
406
407
408
410 "Saves out the phonebook"
411
412 pb=data['phonebook']
413 keys=pb.keys()
414 keys.sort()
415 keys=keys[:self.protocolclass.NUMPHONEBOOKENTRIES]
416
417 self.setmode(self.MODEPHONEBOOK)
418
419
420 uslots={}
421 names={}
422 birthdays={}
423 wallpaper_s={}
424 wallpaper_files={}
425 wallpaper_modifiers={}
426 req=self.protocolclass.phonebookslotrequest()
427
428 self.log('Erasing '+self.desc+' phonebook')
429 progressmax=self.protocolclass.NUMPHONEBOOKENTRIES+len(keys)
430 for slot in range(1,self.protocolclass.NUMPHONEBOOKENTRIES+1):
431 req.slot=slot
432 self.progress(slot,progressmax,"Erasing "+`slot`)
433 try:
434 res=self.sendpbcommand(req,self.protocolclass.phonebookslotresponse, fixup=self.pblinerepair)
435 if len(res) > 0:
436 self.log("Starting capture data for : "+res[0].entry.name)
437 names[slot]=res[0].entry.name
438 birthdays[slot]=res[0].entry.birthday
439 wallpaper_s[slot]=res[0].entry.wallpaper
440 wallpaper_files[slot]=res[0].entry.wallpaper_file
441 wallpaper_modifiers[slot]=res[0].entry.wallpaper_modifier
442 self.log("Captured data for : "+res[0].entry.name)
443 self.log("User Slot from phone: "+str(res[0].entry.uslot))
444 else:
445 names[slot]=""
446 except:
447 names[slot]=""
448 self.log("Slot "+`slot`+" Empty slot or read failed")
449 reqerase=self.protocolclass.phonebooksloterase()
450 reqerase.slot=slot
451 self.sendpbcommand(reqerase, self.protocolclass.phonebookslotupdateresponse)
452
453
454
455 for i in range(len(keys)):
456 slot=keys[i]
457 req=self.protocolclass.phonebookslotupdaterequest()
458 req.entry=self.makeentry(pb[slot],data)
459
460 req.entry.group=self.protocolclass.DEFAULT_GROUP
461
462
463 if len(req.entry.email)==0:
464 req.entry.email=" "
465 if len(req.entry.url)==0:
466 req.entry.url=" "
467
468 if names[slot]==req.entry.name:
469 req.entry.birthday=birthdays[slot]
470
471 if req.entry.wallpaper==self.protocolclass.DEFAULT_WALLPAPER and req.entry.wallpaper_modifier==8:
472 req.entry.wallpaper=wallpaper_s[slot]
473 req.entry.wallpaper_file=wallpaper_files[slot]
474 req.entry.wallpaper_modifier=wallpaper_modifiers[slot]
475
476 if req.entry.wallpaper==self.protocolclass.DEFAULT_WALLPAPER:
477 req.entry.wallpaper_modifier=self.protocolclass.DEFAULT_WALLPAPER_MODIFIER
478 self.log('Writing entry '+`slot`+" - "+req.entry.name+" uSlot : "+str(req.entry.uslot))
479 self.log('Request: '+str(req))
480 self.progress(i+self.protocolclass.NUMPHONEBOOKENTRIES,progressmax,"Writing "+req.entry.name)
481 self.sendpbcommand(req, self.protocolclass.phonebookslotupdateresponse)
482 self.progress(progressmax+1,progressmax+1, "Phone book write completed")
483 self.setmode(self.MODEMODEM)
484 return data
485
486
487
488
489
524
525
526
527
528
529
531 self.log("Sending calendar entries")
532 cal=self.process_calendar(dict['calendar'])
533
534 if __debug__:
535 print 'processed calendar: ', len(cal), ' items'
536 for c in cal:
537 print c.description,':', c.start
538 self.setmode(self.MODEPHONEBOOK)
539 self.log("Saving calendar entries")
540 cal_cnt=0
541 req=self.protocolclass.eventupdaterequest()
542 l = self.protocolclass.NUMCALENDAREVENTS
543 for c in cal:
544
545
546
547 req.slot=cal_cnt
548
549
550 req.start=list(c.start)+[0]
551
552 req.end=req.start
553
554 req.timestamp=list(time.localtime(time.time())[0:6])
555
556 req.alarm=c.alarm
557
558
559 name=c.description
560 if len(name)>self.__cal_max_name_len:
561 name=name[:self.__cal_max_name_len]
562 req.eventname=name
563
564 self.progress(cal_cnt+1, l, "Updating "+name)
565 self.sendpbcommand(req,self.protocolclass.eventupdateresponse)
566 cal_cnt += 1
567
568 self.log('Deleting unused entries')
569 for k in range(cal_cnt, l):
570 self.progress(k, l, "Deleting entry %d" % k)
571 reqerase=self.protocolclass.eventsloterase()
572 reqerase.slot=k
573 self.sendpbcommand(reqerase, self.protocolclass.eventupdateresponse)
574 self.setmode(self.MODEMODEM)
575
576 return dict
577
578
579
580 parentprofile=com_samsung_packet.Profile
582 deviceclasses=("modem",)
583
584 BP_Calendar_Version=3
585 protocolclass=Phone.protocolclass
586 serialsname=Phone.serialsname
587 phone_manufacturer='SAMSUNG ELECTRONICS CO.,LTD.'
588 phone_model='SCH-A850 /180'
589
593
594 _supportedsyncs=(
595 ('phonebook', 'read', None),
596 ('phonebook', 'write', 'OVERWRITE'),
597 ('calendar', 'read', None),
598 ('calendar', 'write', 'OVERWRITE')
599 )
600
601
602 ringtoneorigins=('ringers')
603
604
605
660