/
Sim.cs
475 lines (443 loc) · 16.5 KB
/
Sim.cs
1
2
3
4
5
6
7
8
9
10
11
12
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
/*
* Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (the License);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using static Interop.Telephony;
namespace Tizen.Telephony
{
/// <summary>
/// This class provides APIs that allow you to extract the information stored on a SIM card.
/// </summary>
/// <since_tizen> 3 </since_tizen>
public class Sim
{
internal IntPtr _handle;
/// <summary>
/// The SIM class constructor.
/// </summary>
/// <since_tizen> 3 </since_tizen>
/// <param name="handle">
/// SlotHandle received in the Manager.Init API.
/// </param>
/// <feature>http://tizen.org/feature/network.telephony</feature>
/// <exception cref="NotSupportedException">The required feature is not supported.</exception>
/// <exception cref="ArgumentNullException">
/// This exception occurs if the handle provided is null.
/// </exception>
public Sim(SlotHandle handle)
{
if (handle == null)
{
throw new ArgumentNullException();
}
_handle = handle._handle;
}
/// <summary>
/// Enumeration for the state of the SIM card.
/// </summary>
/// <since_tizen> 3 </since_tizen>
public enum State
{
/// <summary>
/// The SIM is not available on this device.
/// </summary>
Unavailable,
/// <summary>
/// The SIM is locked.
/// </summary>
Locked,
/// <summary>
/// The SIM is available on this device (SIM is not locked).
/// </summary>
Available,
/// <summary>
/// The SIM is in transition between states.
/// </summary>
Unknown
}
/// <summary>
/// Enumeration for the lock state of the SIM card.
/// </summary>
/// <since_tizen> 3 </since_tizen>
public enum LockState
{
/// <summary>
/// The SIM is not in lock.
/// </summary>
Unknown,
/// <summary>
/// The SIM is PIN (Personal Identification Number) locked.
/// </summary>
PinRequired,
/// <summary>
/// The SIM is PUK (Personal Unblocking Code) locked.
/// </summary>
PukRequired,
/// <summary>
/// The SIM is permanently blocked (All the attempts for PIN/PUK failed).
/// </summary>
PermLocked,
/// <summary>
/// The SIM is NCK (Network Control Key) locked.
/// </summary>
NckRequired
}
/// <summary>
/// Enumeration for the type of the SIM card.
/// </summary>
/// <since_tizen> 3 </since_tizen>
public enum ApplicationType
{
/// <summary>
/// SIM (GSM) application.
/// </summary>
Sim = 0x01,
/// <summary>
/// USIM application.
/// </summary>
Usim = 0x02,
/// <summary>
/// CDMA application.
/// </summary>
Csim = 0x04,
/// <summary>
/// ISIM application.
/// </summary>
Isim = 0x08
}
/// <summary>
/// Gets the Integrated Circuit Card IDentification (ICC-ID).
/// The Integrated Circuit Card Identification number internationally identifies SIM cards.
/// </summary>
/// <remarks>
/// To avoid the unexpected behavior of old version applications that have http://tizen.org/privilege/telephony privilege. There is an exceptional handling in case of permission denied.
/// For an application with API version 6 or higher, if an application doesn't have http://tizen.org/privilege/securesysteminfo privilege, it sets with empty string.
/// For an application with API version lower than 6. if an application has http://tizen.org/privilege/telephony privilege, it sets with a pseudo value.
/// </remarks>
/// <since_tizen> 3 </since_tizen>
/// <privilege>http://tizen.org/privilege/securesysteminfo</privilege>
/// <privlevel>partner</privlevel>
/// <value>
/// The Integrated Circuit Card Identification.
/// Empty string if unable to complete the operation.
/// </value>
/// <precondition>
/// The SIM state must be Available.
/// </precondition>
public string IccId
{
get
{
string iccId;
TelephonyError error = Interop.Sim.GetIccId(_handle, out iccId);
if (error != TelephonyError.None)
{
Tizen.Log.Error(Interop.Telephony.LogTag, "GetIccId Failed with error " + error);
return "";
}
return iccId;
}
}
/// <summary>
/// Gets the SIM Operator (MCC [3 digits] + MNC [2~3 digits]).
/// The Operator is embedded in the SIM card.
/// </summary>
/// <since_tizen> 3 </since_tizen>
/// <privilege>http://tizen.org/privilege/telephony</privilege>
/// <value>
/// The SIM Operator.
/// Empty string if unable to complete the operation.
/// </value>
/// <precondition>
/// The SIM state must be Available.
/// </precondition>
public string Operator
{
get
{
string simOperator;
TelephonyError error = Interop.Sim.GetOperator(_handle, out simOperator);
if (error != TelephonyError.None)
{
Tizen.Log.Error(Interop.Telephony.LogTag, "GetOperator Failed with error " + error);
return "";
}
return simOperator;
}
}
/// <summary>
/// Gets the Mobile Subscription Identification Number (MSIN [9~10 digits]) of the SIM provider.
/// </summary>
/// <since_tizen> 3 </since_tizen>
/// <privilege>http://tizen.org/privilege/telephony</privilege>
/// <value>
/// The Mobile Subscription Identification Number.
/// Empty string if unable to complete the operation.
/// </value>
/// <precondition>
/// The SIM state must be Available.
/// </precondition>
public string Msin
{
get
{
string msin;
TelephonyError error = Interop.Sim.GetMsin(_handle, out msin);
if (error != TelephonyError.None)
{
Tizen.Log.Error(Interop.Telephony.LogTag, "GetMsin Failed with error " + error);
return "";
}
return msin;
}
}
/// <summary>
/// Gets the Service Provider Name (SPN) of the SIM card.
/// Gets Service Provider Name embedded in the SIM card. If this value is not stored in the SIM card, an empty string will be returned.
/// </summary>
/// <since_tizen> 3 </since_tizen>
/// <privilege>http://tizen.org/privilege/telephony</privilege>
/// <value>
/// The Service Provider Name.
/// Empty string if unable to complete the operation.
/// </value>
/// <precondition>
/// The SIM state must be Available.
/// </precondition>
public string Spn
{
get
{
string spn;
TelephonyError error = Interop.Sim.GetSpn(_handle, out spn);
if (error != TelephonyError.None)
{
Tizen.Log.Error(Interop.Telephony.LogTag, "GetSpn Failed with error " + error);
return "";
}
return spn;
}
}
/// <summary>
/// Checks whether the current SIM card is different from the previous SIM card.
/// </summary>
/// <since_tizen> 3 </since_tizen>
/// <privilege>http://tizen.org/privilege/telephony</privilege>
/// <value>
/// true if the current SIM card is different from the previous SIM card, otherwise false if the SIM card is not changed.
/// </value>
/// <precondition>
/// The SIM state must be Available.
/// </precondition>
public bool IsChanged
{
get
{
int ischanged;
bool isChanged = false; ;
TelephonyError error = Interop.Sim.IsChanged(_handle, out ischanged);
if (error != TelephonyError.None)
{
Tizen.Log.Error(Interop.Telephony.LogTag, "IsChanged Failed with error " + error);
return false;
}
if (ischanged > 0)
{
isChanged = true;
}
return isChanged;
}
}
/// <summary>
/// Gets the state of the SIM.
/// </summary>
/// <since_tizen> 3 </since_tizen>
/// <privilege>http://tizen.org/privilege/telephony</privilege>
/// <value>
/// The current state of the SIM.
/// </value>
public State CurrentState
{
get
{
State currentState;
TelephonyError error = Interop.Sim.GetState(_handle, out currentState);
if (error != TelephonyError.None)
{
Tizen.Log.Error(Interop.Telephony.LogTag, "GetState Failed with error " + error);
return State.Unavailable;
}
return currentState;
}
}
/// <summary>
/// Gets the count of an application on the UICC.
/// </summary>
/// <since_tizen> 3 </since_tizen>
/// <privilege>http://tizen.org/privilege/telephony</privilege>
/// <value>
/// The masking value for below values are provided by the enumeration ApplicationType.
/// 0 if unable to complete the operation.
/// </value>
/// <precondition>
/// The SIM state must be Available.
/// </precondition>
public uint ApplicationList
{
get
{
uint appList;
TelephonyError error = Interop.Sim.GetApplicationList(_handle, out appList);
if (error != TelephonyError.None)
{
Tizen.Log.Error(Interop.Telephony.LogTag, "GetApplicationList Failed with error " + error);
return 0;
}
return appList;
}
}
/// <summary>
/// Gets the subscriber number embedded in the SIM card. This value contains the MSISDN related to the subscriber.
/// If this value is not stored in SIM card, an empty string will be returned.
/// </summary>
/// <since_tizen> 3 </since_tizen>
/// <privilege>http://tizen.org/privilege/telephony</privilege>
/// <value>
/// The subscriber number in the SIM.
/// Empty string if unable to complete the operation.
/// </value>
/// <precondition>
/// The SIM state must be Available.
/// </precondition>
public string SubscriberNumber
{
get
{
string subscriberNumber;
TelephonyError error = Interop.Sim.GetSubscriberNumber(_handle, out subscriberNumber);
if (error != TelephonyError.None)
{
Tizen.Log.Error(Interop.Telephony.LogTag, "GetSubscriberNumber Failed with error " + error);
return "";
}
return subscriberNumber;
}
}
/// <summary>
/// Gets the subscriber ID.
/// </summary>
/// <since_tizen> 3 </since_tizen>
/// <privilege>http://tizen.org/privilege/telephony</privilege>
/// <value>
/// The subscriber ID.
/// Empty string if unable to complete the operation.
/// </value>
/// <precondition>
/// The SIM state must be Available.
/// </precondition>
public string SubscriberId
{
get
{
string subscriberId;
TelephonyError error = Interop.Sim.GetSubscriberId(_handle, out subscriberId);
if (error != TelephonyError.None)
{
Tizen.Log.Error(Interop.Telephony.LogTag, "GetSubscriberId Failed with error " + error);
return "";
}
return subscriberId;
}
}
/// <summary>
/// Gets the lock state of the SIM.
/// </summary>
/// <since_tizen> 3 </since_tizen>
/// <privilege>http://tizen.org/privilege/telephony</privilege>
/// <value>
/// The current lock state of the SIM.
/// </value>
/// <precondition>
/// The SIM state must be Available.
/// </precondition>
public LockState CurrentLockState
{
get
{
LockState currentLockState;
TelephonyError error = Interop.Sim.GetLockState(_handle, out currentLockState);
if (error != TelephonyError.None)
{
Tizen.Log.Error(Interop.Telephony.LogTag, "GetLockState Failed with error " + error);
return LockState.Unknown;
}
return currentLockState;
}
}
/// <summary>
/// Gets the GID1 (Group Identifier Level 1).
/// Gets Group Identifier Level 1 (GID1) embedded in the SIM card. If this value is not stored in SIM card, an empty string will be returned.
/// </summary>
/// <since_tizen> 3 </since_tizen>
/// <privilege>http://tizen.org/privilege/telephony</privilege>
/// <value>
/// The GID1 (Group Identifier Level 1).
/// Empty string if unable to complete the operation.
/// </value>
/// <precondition>
/// The SIM state must be Available.
/// </precondition>
public string GroupId1
{
get
{
string groupId1;
TelephonyError error = Interop.Sim.GetGroupId1(_handle, out groupId1);
if (error != TelephonyError.None)
{
Tizen.Log.Error(Interop.Telephony.LogTag, "GetGroupId1 Failed with error " + error);
return "";
}
return groupId1;
}
}
/// <summary>
/// Gets the call forwarding indicator state of the SIM.
/// If the state is true, the incoming call will be forwarded to the selected number. State indicates the CFU (Call Forwarding Unconditional) indicator status - Voice (3GPP TS 31.102 4.2.64 EF CFIS).
/// </summary>
/// <since_tizen> 3 </since_tizen>
/// <privilege>http://tizen.org/privilege/telephony</privilege>
/// <value>
/// The value whether the incoming call will be forwarded or not (true: forwarded, false: not forwarded).
/// </value>
/// <precondition>
/// The SIM state must be Available.
/// </precondition>
public bool CallForwardingIndicatorState
{
get
{
bool callForwardingIndicatorState;
TelephonyError error = Interop.Sim.GetCallForwardingIndicatorState(_handle, out callForwardingIndicatorState);
if (error != TelephonyError.None)
{
Tizen.Log.Error(Interop.Telephony.LogTag, "GetCallForwardingIndicatorState Failed with error " + error);
return false;
}
return callForwardingIndicatorState;
}
}
}
}