Package phones ::
Module com_samsungsphn200
|
|
1
2
3
4
5
6
7
8
9
10 """Communicate with a Samsung SPH-N200"""
11
12 import sha
13 import re
14 import struct
15
16 import common
17 import commport
18 import time
19 import p_samsungsphn200
20 import p_brew
21 import com_brew
22 import com_phone
23 import com_samsung_packet
24 import prototypes
25
26 numbertypetab=('home','office','cell','pager','fax','none')
27
28 -class Phone(com_samsung_packet.Phone):
29 "Talk to a Samsung SPH-N200 phone"
30
31 desc="SPH-N200"
32
33 protocolclass=p_samsungsphn200
34 serialsname='sphn200'
35 __groups_range=xrange(5)
36
37 imagelocations=()
38
39
40 __ams_index_file="ams/AmsRegistry"
41
42 - def __init__(self, logtarget, commport):
46
48 """Gets information fundamental to interopating with the phone and UI."""
49
50
51 self.log("Retrieving fundamental phone information")
52 self.log("Phone serial number")
53 print "Calling setmode MODEMODEM"
54 self.setmode(self.MODEMODEM)
55 print "Getting serial number"
56 results['uniqueserial']=sha.new(self.get_esn()).hexdigest()
57
58 self.log("Fundamentals retrieved")
59 return results
60
62 self.log("_setmodemodem")
63
64
65 try:
66 self.comm.sendatcommand("Z")
67 self.comm.sendatcommand('E0V1')
68 return True
69 except:
70 pass
71
72
73 for baud in (0, 19200, 38400, 115200):
74 self.log("Baud="+`baud`)
75 if baud:
76 if not self.comm.setbaudrate(baud):
77 continue
78
79 try:
80 self.comm.sendatcommand("Z")
81 self.comm.sendatcommand('E0V1')
82 return True
83 except:
84 pass
85
86 return False
87
108
110 res={}
111
112 res['serials']=[ {'sourcetype': self.serialsname,
113 'slot': entry.slot,
114 'sourceuniqueid': fundamentals['uniqueserial']} ]
115
116 res['names']=[ {'full': entry.name} ]
117
118 res['numbers']=[]
119 secret=0
120
121 for i in range(len(entry.numbers)):
122 type = self.numbertypetab[entry.numbers[i].numbertype - 1]
123 numhash = {'number': entry.numbers[i].number, 'type': type }
124 res['numbers'].append(numhash)
125
126
127
128 res['flags']=[ {'secret': secret} ]
129
130 return res
131
133 "Saves out the phonebook"
134
135 self.setmode(self.MODEPHONEBOOK)
136 pb=data['phonebook']
137 keys=pb.keys()
138 keys.sort()
139
140 keys=keys[:self.protocolclass.NUMPHONEBOOKENTRIES+1]
141
142
143
144
145
146
147 uslots={}
148 names={}
149
150 req=self.protocolclass.phonebooksloterase()
151 self.log('Erasing '+self.desc+' phonebook')
152 progressmax=self.protocolclass.NUMPHONEBOOKENTRIES+len(keys)
153 for slot in range(2,self.protocolclass.NUMPHONEBOOKENTRIES+1):
154 req.slot = slot
155 self.progress(slot,progressmax,"Erasing "+`slot`)
156 res=self.sendpbcommand(req, self.protocolclass.phonebookslotupdateresponse)
157
158
159 for i in range(len(keys)):
160 slot=keys[i]
161 req=self.protocolclass.phonebookslotupdaterequest()
162 req.entry=self.makeentry(pb[slot],data)
163 self.log('Writing entry '+`slot`+" - "+req.entry.name)
164 self.progress(i+self.protocolclass.NUMPHONEBOOKENTRIES,progressmax,"Writing "+req.entry.name)
165 self.sendpbcommand(req, self.protocolclass.phonebookslotupdateresponse)
166 self.progress(progressmax+1,progressmax+1, "Phone book write completed")
167 return data
168
169 - def makeentry(self, entry, data):
170 e=self.protocolclass.pbentry()
171
172 for k in entry:
173
174 if k=='numbertypes' or k=='secrets':
175 continue
176 if k=='ringtone':
177
178 continue
179 elif k=='wallpaper':
180
181 continue
182 elif k=='numbers':
183
184 nnum=len(entry[k])
185 for i in range(nnum):
186 enpn=self.protocolclass.phonenumber()
187 if i+1 == nnum:
188 enpn.last_number=True
189 enpn.numbertype=entry['numbertypes'][i]+1
190 enpn.number=entry[k][i]
191 e.numbers.append(enpn)
192 continue
193
194 setattr(e, k, entry[k])
195 return e
196
197
198 getwallpapers=None
199 getringtones=None
200
201 -class Profile(com_samsung_packet.Profile):
202 protocolclass=Phone.protocolclass
203 serialsname=Phone.serialsname
204 phone_manufacturer='SAMSUNG'
205 phone_model='SPH-N200'
206 deviceclasses=("serial",)
207
211
212 _supportedsyncs=(
213 ('phonebook', 'read', None),
214 ('phonebook', 'write', 'OVERWRITE'),
215 )
216
218 """Converts the data to what will be used by the phone
219
220 @param data: contains the dict returned by getfundamentals
221 as well as where the results go"""
222
223 results={}
224
225
226 pb=data['phonebook']
227
228 slots=[ (helper.getserial(pb[pbentry].get("serials", []), self.serialsname, data['uniqueserial'], "slot", None), pbentry)
229 for pbentry in pb]
230 slots.sort()
231
232 newones=[(pbentry,slot) for slot,pbentry in slots if slot is None]
233 existing=[(pbentry,slot) for slot,pbentry in slots if slot is not None]
234
235 uslotsused={}
236
237 tempslot=0
238 for pbentry,slot in existing+newones:
239
240 if len(results)==self.protocolclass.NUMPHONEBOOKENTRIES:
241 break
242
243 try:
244
245 e={}
246
247 entry=data['phonebook'][pbentry]
248
249 secret=helper.getflag(entry.get('flags', []), 'secret', False)
250 if secret:
251 secret=1
252 else:
253 secret=0
254
255
256 e['name']=helper.getfullname(entry.get('names', []),1,1,12)[0]
257
258 cat=helper.makeone(helper.getcategory(entry.get('cagetgories',[]),0,1,12), None)
259
260
261
262 minnumbers=1
263 numbers=helper.getnumbers(entry.get('numbers', []),minnumbers,self.protocolclass.NUMPHONENUMBERS)
264 e['numbertypes']=[]
265 e['numbers']=[]
266 e['secrets']=[]
267 unusednumbers=[]
268 typesused={}
269 defaulttypenum=0
270 for num in numbers:
271 typename=num['type']
272 if typesused.has_key(typename):
273 unusednumbers.append(num)
274 continue
275 typesused[typename]=1
276 for typenum,tnsearch in enumerate(self.numbertypetab):
277 if typename==tnsearch:
278 if defaulttypenum==0:
279 defaulttypenum=typenum
280 number=self.phonize(num['number'])
281 if len(number)>self.protocolclass.MAXNUMBERLEN:
282
283 number=number[:self.protocolclass.MAXNUMBERLEN]
284 e['numbers'].append(number)
285 if(num.has_key('speeddial')):
286
287
288
289 e['speeddial']=typenum
290 tryuslot = num['speeddial']
291 e['numbertypes'].append(typenum)
292 e['secrets'].append(secret)
293
294 break
295
296
297
298 if e.has_key('speeddial'):
299 if tryuslot>=1 and tryuslot<=self.protocolclass.NUMPHONEBOOKENTRIES and not uslotsused.has_key(tryuslot):
300 uslotsused[tryuslot]=1
301 e['uslot']=tryuslot
302 else:
303 e['speeddial']=defaulttypenum
304
305
306 if slot is None or slot<2 or slot>self.protocolclass.NUMPHONEBOOKENTRIES or slot in results:
307 for i in range(2,100000):
308 if i not in results:
309 slot=i
310 break
311
312 e['slot']=slot
313
314 results[slot]=e
315 except helper.ConversionFailed:
316 continue
317
318
319
320 tryuslot=1
321 for slot in results.keys():
322
323 e=results[slot]
324 if not e.has_key('uslot'):
325 while tryuslot<self.protocolclass.NUMPHONEBOOKENTRIES and uslotsused.has_key(tryuslot):
326 tryuslot += 1
327 uslotsused[tryuslot]=1
328 e['uslot'] = tryuslot
329 results[slot] = e
330
331 data['phonebook']=results
332 return data
333
335 """Convert the phone number into something the phone understands
336 All digits, P, T, * and # are kept, everything else is removed"""
337
338 return re.sub("[^0-9PT#*]", "", str)[:self.protocolclass.MAXNUMBERLEN]
339