Package phones ::
Module com_samsungscha870
|
|
1
2
3
4
5
6
7
8
9
10
11 """Communicate with the Samsung SCH-A870 Phone"""
12
13
14
15
16 import bpcalendar
17 import common
18 import helpids
19 import com_samsungscha950 as com_a950
20 import p_samsungscha950 as p_a950
21 import p_samsungscha870 as p_a870
22 import prototypes
23
24 parentphone=com_a950.Phone
26 desc='SCH-A870'
27 helpid=helpids.ID_PHONE_SAMSUNGSCHA870
28 protocolclass=p_a870
29 serialsname='scha870'
30
31
32 my_model='SCH-A870/187'
33 my_manufacturer='SAMSUNG'
34 detected_model='A870'
35
36 ringtone_noring_range='range_tones_preloaded_el_15'
37 ringtone_default_range='range_tones_preloaded_el_01'
38 builtin_ringtones={
39 'VZW Default Tone': 0x52,
40 'Melody 1': 0x56,
41 'Melody 2': 0x57,
42 'Melody 3': 0x58,
43 'Melody 4': 0x59,
44 'Melody 5': 0x5A,
45 'Melody 6': 0x5B,
46 'Bell 1': 0x53,
47 'Bell 2': 0x54,
48 'Bell 3': 0x55,
49 'Beep Once': 0x93,
50 'No Ring': 0xC2,
51 'Default': None,
52 }
53 builtin_sounds={
54 'Clapping': 0x5C,
55 'Crowd': 0x5D,
56 'Happy Birthday': 0x5E,
57 'Rain Forest': 0x5F,
58 'Train': 0x60,
59
60 }
61 builtin_wallpapers={
62 'No Picture': None,
63 }
64
65 - def __init__(self, logtarget, commport):
71
72 - def getfilecontents(self, filename, use_cache=False):
73 if filename and filename[0]!='/':
74 return parentphone.getfilecontents(self, '/'+filename, use_cache)
75 return parentphone.getfilecontents(self, filename, use_cache)
76
86
87 - def _get_dir_index(self, idx, result, pathname, origin, excludenames=()):
88
89 for _path in self.listfiles(pathname):
90 _file=common.basename(_path)
91 if _file in excludenames:
92 continue
93 result[idx]={ 'name': _file,
94 'filename': _path,
95 'origin': origin,
96 }
97 idx+=1
98 return idx
99
110
132
138
139 - def _get_del_new_list(self, index_key, media_key, merge, fundamentals,
140 origins):
141 """Return a list of media being deleted and being added"""
142 _index=fundamentals.get(index_key, {})
143 _media=fundamentals.get(media_key, {})
144 _index_file_list=[_entry['name'] for _entry in _index.values() \
145 if _entry.has_key('filename') and \
146 _entry.get('origin', None) in origins ]
147 _bp_file_list=[_entry['name'] for _entry in _media.values() \
148 if _entry.get('origin', None) in origins ]
149 if merge:
150
151 _del_list=[]
152 _new_list=_bp_file_list
153 else:
154
155 _del_list=[x for x in _index_file_list if x not in _bp_file_list]
156 _new_list=_bp_file_list
157 return _del_list, _new_list
158
160 """Save ringtones to the phone"""
161 self.log('Writing ringtones to the phone')
162 try:
163 _del_list, _new_list=self._get_del_new_list('ringtone-index',
164 'ringtone',
165 merge,
166 fundamentals,
167 frozenset(('ringers', 'sounds')))
168 if __debug__:
169 self.log('Delete list: '+','.join(_del_list))
170 self.log('New list: '+','.join(_new_list))
171 self._replace_files('ringtone-index', 'ringtone',
172 _new_list, fundamentals)
173 self._add_files('ringtone-index', 'ringtone',
174 _new_list, fundamentals)
175 fundamentals['rebootphone']=True
176 except:
177 if __debug__:
178 raise
179 return fundamentals
180
181 - def _add_files(self, index_key, media_key,
182 new_list, fundamentals):
183 """Add new file using BEW"""
184 _index=fundamentals.get(index_key, {})
185 _media=fundamentals.get(media_key, {})
186 _files_added=[]
187 for _file in new_list:
188 _data=self._item_from_index(_file, 'data', _media)
189 if not _data:
190 self.log('Failed to write file %s due to no data'%_file)
191 continue
192 if self._item_from_index(_file, None, _index) is None:
193
194 _origin=self._item_from_index(_file, 'origin', _media)
195 if _origin=='ringers':
196 _path=self.protocolclass.RT_PATH
197 elif _origin=='sounds':
198 _path=self.protocolclass.SND_PATH
199 elif _origin=='images':
200 _path=self.protocolclass.PIC_PATH
201 else:
202 selg.log('File %s has unknown origin, skip!'%_file)
203 continue
204 _file_name=_path+'/'+_file
205 try:
206 self.writefile(_file_name, _data)
207 _files_added.append({ 'filename': _file,
208 'filesize': len(_data) })
209 except:
210 self.log('Failed to write file '+_file_name)
211 if __debug__:
212 raise
213 return _files_added
214
239
241
242 """Save ringtones to the phone"""
243 self.log('Writing wallpapers to the phone')
244 try:
245 _del_list, _new_list=self._get_del_new_list('wallpaper-index',
246 'wallpapers',
247 merge,
248 fundamentals,
249 frozenset(['images']))
250 if __debug__:
251 self.log('Delete list: '+','.join(_del_list))
252 self.log('New list: '+','.join(_new_list))
253 self._replace_files('wallpaper-index', 'wallpapers',
254 _new_list, fundamentals)
255 _files_added=self._add_files('wallpaper-index', 'wallpapers',
256 _new_list, fundamentals)
257 self._update_wp_index_file(_files_added)
258 fundamentals['rebootphone']=True
259 except:
260 if __debug__:
261 raise
262 return fundamentals
263
269
270
271 parentpbentry=com_a950.PBEntry
272 -class PBEntry(parentpbentry):
273
274
275 - def _build_number(self, number, ringtone, primary):
276
277 _num_type=self._pb_type_dict.get(number['type'], None)
278 if not _num_type:
279
280 return
281
282 if _num_type=='cell' and self.pb.cell.number:
283 _num_type='cell2'
284
285 _entry=self.phone.protocolclass.ss_number_entry()
286 _entry.number=number['number']
287 _sd=number.get('speeddial', None)
288 if _sd is not None:
289 _entry.speeddial=_sd
290 if primary:
291 _entry.primary=1
292
293 setattr(self.pb, _num_type, _entry)
294
295 - def _build_wallpaper(self, wallpaper):
296
297 if not wallpaper:
298 return
299 for _rt in self.fundamentals.get('wallpaper-index', {}).values():
300 if _rt.get('name', None)==wallpaper and \
301 _rt.get('filename', None):
302 self.pb.wallpaper='%(name)s|%(pathname)s'% {
303 'name': _rt['name'],
304 'pathname': _rt['filename'] }
305 break
306
307 - def _build_ringtone(self, ringtone):
308
309 if not ringtone:
310 self.pb.ringtone='Default'
311 return
312 for _wp in self.fundamentals.get('ringtone-index', {}).values():
313 if _wp.get('name', None)==ringtone:
314 if _wp.get('filename', None):
315 self.pb.ringtone=_wp['filename'] if _wp['filename'][0]=='/' \
316 else '/'+_wp['filename']
317 elif _wp.get('origin', None)=='builtin':
318 self.pb.ringtone=_wp['name']
319 break
320
321 - def _build(self, entry):
322
323 super(PBEntry, self)._build(entry)
324 self._build_ringtone(entry.get('ringtones', [{}])[0].get('ringtone', None))
325
326
328 if self.pb.info&p_class.PB_FLG_WP and \
329 self.pb.wallpaper:
330 entry['wallpapers']=[{ 'wallpaper': self.pb.wallpaper.partition('|')[0],
331 'use': 'call' }]
333 if self.pb.info&p_class.PB_FLG_CRINGTONE and \
334 self.pb.ringtone:
335 entry['ringtones']=[{ 'ringtone': common.basename(self.pb.ringtone),
336 'use': 'call' }]
337 - def getvalue(self):
341
342
343 calendarentryparent=com_a950.CalendarEntry
344 -class CalendarEntry(calendarentryparent):
345 """Transient class to handle calendar data being sent to, retrieved from
346 the phone.
347 """
348
350
351 for _rt_name, _rt_code in self.phone.builtin_ringtones.items():
352 if _rt_code==self.cal.ringtoneindex:
353 return _rt_name
354 for _rt_name, _rt_code in self.phone.builtin_sounds.items():
355 if _rt_code==self.cal.ringtoneindex:
356 return _rt_name
357
358 - def getvalue(self):
368
369
370 - def _build_ringtone(self, entry):
371 _rt_name=entry.ringtone
372 if self.phone.builtin_ringtones.get(_rt_name, None):
373 return self.phone.builtin_ringtones[_rt_name]
374 elif self.phone.builtin_sounds.get(_rt_name, None):
375 return self.phone.builtin_sounds[_rt_name]
376 else:
377 return 0
378
379 - def _build(self, entry):
380
381 self.cal.titlelen=len(entry.desc_loc)
382 self.cal.title=entry.desc_loc
383 self.cal.start=entry.start
384 self.cal.exptime=entry.end[3:5]
385 self.cal.alarm=self._build_alarm(entry)
386 self.cal.alert=self._build_alert(entry)
387 self.cal.duration=self._build_duration(entry)
388 self.cal.ringtoneindex=self._build_ringtone(entry)
389
390
391 parentprofile=com_a950.Profile
393 serialsname=Phone.serialsname
394
395 WALLPAPER_WIDTH=128
396 WALLPAPER_HEIGHT=160
397
398 phone_manufacturer=Phone.my_manufacturer
399 phone_model=Phone.my_model
400 autodetect_delay=5
401
402 RINGTONE_LIMITS= {
403 'MAXSIZE': 290000
404 }
405
406
407 ringtoneorigins=('ringers', 'sounds')
408
409 excluded_ringtone_origins=()
410
411
412 imageorigins={}
413 imageorigins.update(common.getkv(parentprofile.stockimageorigins, "images"))
416
417
418 imagetargets={}
419 imagetargets.update(common.getkv(parentprofile.stockimagetargets, "wallpaper",
420 {'width': 128, 'height': 128, 'format': "JPEG"}))
421 imagetargets.update(common.getkv(parentprofile.stockimagetargets, "pictureid",
422 {'width': 96, 'height': 84, 'format': "JPEG"}))
423 imagetargets.update(common.getkv(parentprofile.stockimagetargets, "fullscreen",
424 {'width': 128, 'height': 160, 'format': "JPEG"}))
425 imagetargets.update(common.getkv(parentprofile.stockimagetargets, "outsidelcd",
426 {'width': 96, 'height': 84, 'format': "JPEG"}))
429
430 _supportedsyncs=(
431 ('phonebook', 'read', None),
432 ('phonebook', 'write', 'OVERWRITE'),
433 ('calendar', 'read', None),
434 ('calendar', 'write', 'OVERWRITE'),
435 ('ringtone', 'read', None),
436 ('ringtone', 'write', 'MERGE'),
437 ('wallpaper', 'read', None),
438 ('wallpaper', 'write', 'MERGE'),
439 ('memo', 'read', None),
440 ('memo', 'write', 'OVERWRITE'),
441 ('call_history', 'read', None),
442 ('sms', 'read', None),
443 )
444