blob: bb431b992fa90a43696e54d168a0067250371a8b [file] [log] [blame]
lle1d5d7c2022-01-18 12:34:30 +00001/*=============================================================================
2# FileName: lynq_sim.cpp
3# Desc: about SIM API
4# Author: mobiletek
5# Version: V1.0
6# LastChange: 2021-12-29
7# History:
8=============================================================================*/
9#include <stdio.h>
10#include <sys/types.h>
11#include <sys/socket.h>
12#include <arpa/inet.h>
13#include <string.h>
14#include <unistd.h>
15#include <binder/Parcel.h>
16#include <log/log.h>
17#include <cutils/jstring.h>
18#include <pthread.h>
19#include "lynq_sim.h"
20#include <sys/socket.h>
21#include <netinet/in.h>
22#include <arpa/inet.h>
23#define MAX_BUF 20
24#define MAX_NUM 80
25#define RIL_REQUEST_GET_SIM_STATUS 1
26#define RIL_REQUEST_GET_IMSI 11
27#define RIL_REQUEST_QUERY_ICCID 2026
28#define RIL_REQUEST_SET_FACILITY_LOCK 43
29#define RIL_REQUEST_QUERY_FACILITY_LOCK 42
30#define RIL_REQUEST_ENTER_SIM_PIN 2
31#define RIL_REQUEST_ENTER_SIM_PUK 3
32#define RIL_REQUEST_CHANGE_SIM_PIN 6
33#define RIL_REQUEST_OEM_HOOK_RAW 59
ll887a0172022-03-09 03:13:31 +000034#define RIL_REQUEST_SCREEN_STATE 61
llba425bd2022-03-17 02:23:00 +000035#define RIL_REQUEST_SIM_IO 28
ll4c5c6b72022-03-31 15:27:23 +080036#define RIL_REQUEST_DEVICE_IDENTITY 98
rjw5d2a50e2022-02-28 15:01:49 +080037#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008
lle1d5d7c2022-01-18 12:34:30 +000038#define MAX_LEN 1024*8
39#define MAX_NUM 10
40#define LOG_TAG "LYNQ_SIM"
41#define FLAG_TESS 0
42using ::android::Parcel;
43#define DEST_PORT 8088
44#define DSET_IP_ADDRESS "127.0.0.1"
45
46typedef struct{
47 int uToken;
48 int request;
49 int paramLen;
50 char param[MAX_LEN];
51}lynq_client_t;
52
53lynq_client_t client_t;
54/* socket文件描述符 */
55int len_addr_serv;
56struct sockaddr_in addr_serv;
57static int sock_fd = 0;
58int Global_uToken = 0;
q.huang7de1d662022-09-13 14:19:24 +080059int solicited_token = -1;
lle1d5d7c2022-01-18 12:34:30 +000060int resp_type = -1;
61int request = -1;
62int slot_id = -1;
63int error1 = -1;
llab0f3e12022-07-20 11:59:51 +000064static pthread_mutex_t g_lynq_sim_sendto_mutex;
llba425bd2022-03-17 02:23:00 +000065/**
66 * @brief mark call initialization state
67 * 0: deinit state
68 * 1: init state
69 */
70int g_lynq_sim_init_flag = 0;
71
72/**
73 * @brief lynq_req_sim_io need to send request
74 */
75char data_buf[32] = {0};
76char pin2_buf[32] = {0};
77char aidPtr_buf[32] = {0};
lle1d5d7c2022-01-18 12:34:30 +000078
llb15599d2022-04-01 07:50:08 +000079/**/
80char options_buf[32] = {0};
81char time_buf[32] = {0};
82char message_buf[32] = {0};
83
lle1d5d7c2022-01-18 12:34:30 +000084int lynq_sim_init(int utoken){
llba425bd2022-03-17 02:23:00 +000085 if(g_lynq_sim_init_flag == 1)
86 {
87 RLOGD("lynq_sim_init failed");
88 return -1;
89 }
90 g_lynq_sim_init_flag = 1;
lle1d5d7c2022-01-18 12:34:30 +000091 if(utoken < 0){
92 return -1;
93 }
lle1d5d7c2022-01-18 12:34:30 +000094 Global_uToken = utoken;
95 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
ll33334af2022-06-30 16:54:51 +080096 if (-1 == sock_fd)
97 {
98 return sock_fd;
99 }
100 struct timeval timeOut;
llab0f3e12022-07-20 11:59:51 +0000101 timeOut.tv_sec = 60;
ll33334af2022-06-30 16:54:51 +0800102 timeOut.tv_usec = 0;
103 if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
104 {
105 RLOGD("time out setting failed\n");
106 return -1;
107 }
lle1d5d7c2022-01-18 12:34:30 +0000108 /* 设置address */
109 memset(&addr_serv, 0, sizeof(addr_serv));
110 addr_serv.sin_family = AF_INET;
111 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
112 addr_serv.sin_port = htons(DEST_PORT);
113 len_addr_serv = sizeof(addr_serv);
114 /*test*/
115 return 0;
116}
117
118int lynq_sim_deinit(void){
llba425bd2022-03-17 02:23:00 +0000119 if(g_lynq_sim_init_flag == 0)
120 {
121 RLOGD("lynq_sim_deinit failed");
122 return -1;
123 }
124 g_lynq_sim_init_flag = 0;
lle1d5d7c2022-01-18 12:34:30 +0000125 close(sock_fd);
126 return 0;
127}
128
129static char * lynqStrdupReadString(Parcel &p) {
130 size_t stringlen;
131 const char16_t *s16;
132
133 s16 = p.readString16Inplace(&stringlen);
134 return strndup16to8(s16, stringlen);
135}
136
llba425bd2022-03-17 02:23:00 +0000137/*If you need to use any API under lynq_sim, you mustfirst call the lynq_sim_init() function to initialize these functions.*/
lle1d5d7c2022-01-18 12:34:30 +0000138int lynq_get_sim_status(int *card_status)
139{
ll27dbe752022-08-10 00:33:52 -0700140 if(g_lynq_sim_init_flag == 0)
141 {
142 return -1;
143 }
lle1d5d7c2022-01-18 12:34:30 +0000144 int ret = -1;
145 if(card_status == NULL)
146 return ret;
147 int send_num = 0;
148 int recv_num = 0;
149 int len = 0;
150 lynq_client_t client_t1;
151 memset(&client_t1, 0, sizeof(client_t1) );
152 client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
153 client_t1.paramLen = 0;
154 client_t1.uToken = Global_uToken;
155 char res_data[MAX_LEN] = {0};
156 int len1 = sizeof(client_t1.param);
157 memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
llab0f3e12022-07-20 11:59:51 +0000158 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000159 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
160 if(send_num < 0)
161 {
162 RLOGD("sendto error:");
163 return send_num;
164 }
165 //get data msg
166 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
167 if(recv_num < 0 || recv_num == 0)
168 {
169 RLOGD("recvfrom step2 fail:");
170 return recv_num;
171 }
llab0f3e12022-07-20 11:59:51 +0000172 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000173 Parcel p;;
174 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
175 p.setDataPosition(0);
176 if(p.dataAvail() > 0)
177 {
178 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800179 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000180 p.readInt32(&request);
181 p.readInt32(&slot_id);
182 p.readInt32(&error1);
183 p.readInt32(card_status);
184 }
185 return error1;
186}
llba425bd2022-03-17 02:23:00 +0000187
lle1d5d7c2022-01-18 12:34:30 +0000188int lynq_get_imsi(char buf[])
189{
ll27dbe752022-08-10 00:33:52 -0700190 if(g_lynq_sim_init_flag == 0)
191 {
192 return -1;
193 }
lle1d5d7c2022-01-18 12:34:30 +0000194 int ret = -1;
195 if(buf == NULL)
196 return ret;
197 int send_num = 0;
198 int recv_num = 0;
199 int len = 0;
200 lynq_client_t client_t1;
201 memset(&client_t1, 0, sizeof(client_t1) );
202 client_t1.request = RIL_REQUEST_GET_IMSI;
203 client_t1.paramLen = 0;
204 client_t1.uToken = Global_uToken;
205 char res_data[MAX_LEN] = {0};
206 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000207 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000208 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
209 if(send_num < 0)
210 {
211 RLOGD("sendto error:");
212 return send_num;
213 }
214 //get data msg
215 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000216 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000217 if(recv_num < 0 || recv_num == 0)
218 {
219 RLOGD("recvfrom step2 fail:");
220 return recv_num;
221 }
222 Parcel p;
223 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
224 p.setDataPosition(0);
225 if(p.dataAvail() > 0)
226 {
227 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800228 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000229 p.readInt32(&request);
230 p.readInt32(&slot_id);
231 p.readInt32(&error1);
232 if(!error1){
233 char * test = lynqStrdupReadString(p);
234 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800235 free(test);
lle1d5d7c2022-01-18 12:34:30 +0000236 }
237 }
238 return error1;
239}
240
241
242/*add by lei*/
243
244int lynq_get_iccid(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700245 if(g_lynq_sim_init_flag == 0)
246 {
247 return -1;
248 }
lle1d5d7c2022-01-18 12:34:30 +0000249 int ret = -1;
250 if(buf == NULL)
251 return ret;
252 int send_num = 0;
253 int recv_num = 0;
254 int len = 0;
255 client_t.request = RIL_REQUEST_QUERY_ICCID;
256 client_t.paramLen = 0;
257 client_t.uToken = Global_uToken;
258 char res_data[MAX_LEN] = {0};
259 memset(client_t.param, 0, sizeof(client_t.param));
llab0f3e12022-07-20 11:59:51 +0000260 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000261 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
262 if(send_num < 0)
263 {
264 RLOGD("sendto error:");
265 return send_num;
266 }
267 //get data msg
268 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000269 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000270 if(recv_num < 0 || recv_num == 0)
271 {
272 RLOGD("recvfrom step2 fail:");
273 return recv_num;
274 }
275 Parcel p;
276 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
277 p.setDataPosition(0);
278 if(p.dataAvail() > 0)
279 {
280 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800281 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000282 p.readInt32(&request);
283 p.readInt32(&slot_id);
284 p.readInt32(&error1);
285 if(!error1){
286 char * test = lynqStrdupReadString(p);
287 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800288 free(test);
lle1d5d7c2022-01-18 12:34:30 +0000289 }
290 }
291 return error1;
292}
293
294int lynq_enable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700295 if(g_lynq_sim_init_flag == 0)
296 {
297 return -1;
298 }
lle1d5d7c2022-01-18 12:34:30 +0000299 int ret = -1;
300 if(pin == NULL)
301 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800302 if(!strlen(pin))
303 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000304 int send_num = 0;
305 int recv_num = 0;
306 char res_data[MAX_LEN] = {0};
307 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
308 client_t.paramLen = 4;
309 client_t.uToken = Global_uToken;
310 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
llab0f3e12022-07-20 11:59:51 +0000311 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000312 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
313 if(send_num < 0)
314 {
315 RLOGD("sendto error:");
316 return send_num;
317 }
318
319 //get data msg
320 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000321 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000322 if(recv_num < 0 || recv_num == 0)
323 {
324 RLOGD("recvfrom step2 fail:");
325 return recv_num;
326 }
327 Parcel p;
328 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
329 p.setDataPosition(0);
330 if(p.dataAvail() > 0)
331 {
332 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800333 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000334 p.readInt32(&request);
335 p.readInt32(&slot_id);
336 p.readInt32(&error1);
337 }
338 return error1;
339}
340
lle6cc3932022-08-18 06:06:39 -0700341int lynq_sim_power(int mode)
342{
343 if(g_lynq_sim_init_flag == 0)
344 {
345 return -1;
346 }
347 int ret = -1;
348 int send_num = 0;
349 int recv_num = 0;
350 int len = 0;
351 char res_data[MAX_LEN] = {0};
352 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
353 client_t.paramLen = 1;
354 client_t.uToken = Global_uToken;
355 char buf[64] = {0};
356 sprintf(buf, "%s%d", "AT+ESIMPOWER=", mode);
357 sprintf(client_t.param, "%s\n", buf);
358 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
359 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
360 if(send_num < 0)
361 {
362 RLOGD("sendto error:");
363 return ret;
364 }
365 //get data msg
366 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
367 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
368 if(recv_num < 0 || recv_num == 0)
369 {
370 RLOGD("recvfrom step2 fail:");
371 return recv_num;
372 }
373 Parcel p;
374 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
375 p.setDataPosition(0);
376 int num = -1;
377 if(p.dataAvail() > 0)
378 {
379 char test[128] = {0};
380 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800381 p.readInt32(&solicited_token);
lle6cc3932022-08-18 06:06:39 -0700382 p.readInt32(&request);
383 p.readInt32(&slot_id);
384 p.readInt32(&error1);
385 p.readInt32(&num);
386 if(num == -1){
387 }else{
388 p.read(test, num);
389 return error1;
390 }
391 }
392 return error1;
393}
394
lle1d5d7c2022-01-18 12:34:30 +0000395int lynq_disable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700396 if(g_lynq_sim_init_flag == 0)
397 {
398 return -1;
399 }
lle1d5d7c2022-01-18 12:34:30 +0000400 int ret = -1;
401 if(pin == NULL)
402 return ret;
403 int send_num = 0;
404 int recv_num = 0;
405 char res_data[MAX_LEN] = {0};
406 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
407 client_t.paramLen = 4;
408 client_t.uToken = Global_uToken;
409 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
llab0f3e12022-07-20 11:59:51 +0000410 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000411 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
412 if(send_num < 0)
413 {
414 RLOGD("sendto error:");
415 return send_num;
416 }
417 //get data msg
418 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000419 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000420 if(recv_num < 0 || recv_num == 0)
421 {
422 RLOGD("recvfrom step2 fail:");
423 return recv_num;
424 }
425 Parcel p;
426 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
427 p.setDataPosition(0);
428 if(p.dataAvail() > 0)
429 {
430 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800431 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000432 p.readInt32(&request);
433 p.readInt32(&slot_id);
434 p.readInt32(&error1);
435 }
436 return error1;
437}
438
439int lynq_query_pin_lock(char *pin,int buf[]){
ll27dbe752022-08-10 00:33:52 -0700440 if(g_lynq_sim_init_flag == 0)
441 {
442 return -1;
443 }
lle1d5d7c2022-01-18 12:34:30 +0000444 int ret = -1;
445 if(pin == NULL)
446 return ret;
447 int send_num = 0;
448 int recv_num = 0;
449 int len = 0;
450 client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
451 client_t.paramLen = 3;
452 client_t.uToken = Global_uToken;
453 char res_data[MAX_LEN] = {0};
454 sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
llab0f3e12022-07-20 11:59:51 +0000455 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000456 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
457 if(send_num < 0)
458 {
459 RLOGD("sendto error:");
460 return send_num;
461 }
462 //get data msg
463 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000464 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000465 if(recv_num < 0 || recv_num == 0)
466 {
467 RLOGD("recvfrom step2 fail:");
468 return recv_num;
469 }
470 Parcel p;
471 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
472 p.setDataPosition(0);
473 int num = -1;
474 if(p.dataAvail() > 0)
475 {
476 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800477 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000478 p.readInt32(&request);
479 p.readInt32(&slot_id);
480 p.readInt32(&error1);
481 p.readInt32(&num);
482 if(num > 0){
483 int *test = (int *)calloc(1, sizeof(int)*num);
484 for(int i =0; i <num; i++){
485 p.readInt32(&test[i]);
486 buf[i] = test[i];
487 }
488 free(test);
489 }
490 }
491 return error1;
492}
493
494int lynq_verify_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700495 if(g_lynq_sim_init_flag == 0)
496 {
497 return -1;
498 }
lle1d5d7c2022-01-18 12:34:30 +0000499 int ret = -1;
500 if(pin == NULL)
501 return ret;
502 int send_num = 0;
503 int recv_num = 0;
504 char res_data[MAX_LEN] = {0};
505 int len = 0;
506 client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
507 client_t.paramLen = 1;
508 client_t.uToken = Global_uToken;
509 sprintf(client_t.param, "%s\n", pin);
llab0f3e12022-07-20 11:59:51 +0000510 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000511 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
512 if(send_num < 0)
513 {
514 RLOGD("sendto error:");
515 return send_num;
516 }
517 //get data msg
518 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000519 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000520 if(recv_num < 0 || recv_num == 0)
521 {
522 RLOGD("recvfrom step2 fail:");
523 return recv_num;
524 }
525 Parcel p;
526 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
527 p.setDataPosition(0);
528 if(p.dataAvail() > 0)
529 {
530 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800531 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000532 p.readInt32(&request);
533 p.readInt32(&slot_id);
534 p.readInt32(&error1);
535 }
536 return error1;
537}
538
539int lynq_change_pin(char *old_pin, char *new_pin){
ll27dbe752022-08-10 00:33:52 -0700540 if(g_lynq_sim_init_flag == 0)
541 {
542 return -1;
543 }
lle1d5d7c2022-01-18 12:34:30 +0000544 int ret = -1;
545 if(old_pin == NULL || new_pin == NULL)
546 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800547 if(!strlen(new_pin))
548 return ret;
ll3fe03462022-03-01 09:18:53 +0000549 if(!strlen(old_pin))
550 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000551 int send_num = 0;
552 int recv_num = 0;
553 char res_data[MAX_LEN] = {0};
554 int len = 0;
555 client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
556 client_t.paramLen = 2;
557 client_t.uToken = Global_uToken;
558 sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
llab0f3e12022-07-20 11:59:51 +0000559 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000560 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
561 if(send_num < 0)
562 {
563 RLOGD("sendto error:");
564 return send_num;
565 }
566 //get data msg
567 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000568 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000569 if(recv_num < 0 || recv_num == 0)
570 {
571 RLOGD("recvfrom step2 fail:");
572 return recv_num;
573 }
574 Parcel p;
575 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
576 p.setDataPosition(0);
577 if(p.dataAvail() > 0)
578 {
579 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800580 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000581 p.readInt32(&request);
582 p.readInt32(&slot_id);
583 p.readInt32(&error1);
584 }
585 return error1;
586}
587
588int lynq_unlock_pin(char *puk, char *pin){
ll27dbe752022-08-10 00:33:52 -0700589 if(g_lynq_sim_init_flag == 0)
590 {
591 return -1;
592 }
lle1d5d7c2022-01-18 12:34:30 +0000593 int ret = -1;
594 if(puk == NULL || pin == NULL)
595 return ret;
596 int send_num = 0;
597 int recv_num = 0;
598 char res_data[MAX_LEN] = {0};
599 int len = 0;
600 client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
601 client_t.paramLen = 2;
602 client_t.uToken = Global_uToken;
603 sprintf(client_t.param, "%s %s\n", puk, pin);
llab0f3e12022-07-20 11:59:51 +0000604 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000605 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
606 if(send_num < 0)
607 {
608 RLOGD("sendto error:");
609 return send_num;
610 }
611 //get data msg
612 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000613 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000614 if(recv_num < 0 || recv_num == 0)
615 {
616 RLOGD("recvfrom step2 fail:");
617 return recv_num;
618 }
619 Parcel p;
620 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
621 p.setDataPosition(0);
622 if(p.dataAvail() > 0)
623 {
624 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800625 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000626 p.readInt32(&request);
627 p.readInt32(&slot_id);
628 p.readInt32(&error1);
629 }
630 return error1;
631}
632
633static void delete_char(char str[],char target){
634 if(str == NULL){
635 return;
636 }
637 int i,j;
638 for(i=j=0;str[i]!='\0';i++){
639 if(str[i]!=target){
640 str[j++]=str[i];
641 }
642 }
643 str[j]='\0';
644}
645
646static int parse_param(char *cmd, char **argv, char buf[]){
647 if(cmd == NULL || argv == NULL || buf == NULL){
ll1651f342022-06-06 10:13:48 +0800648 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000649 }
650 if(strstr(cmd,"ERROR")){
lle1d5d7c2022-01-18 12:34:30 +0000651 return 3;
652 }
653 else{
654 int argc = 0;
655 char *token;
656 token = strtok(cmd, ",");
lle4860662022-09-15 19:07:10 +0800657 if(token == NULL)
658 {
659 return 9001;
660 }
llbe2bdbd2022-06-14 02:40:33 +0000661 if(strstr(token, "CNUM"))
662 {
lle1d5d7c2022-01-18 12:34:30 +0000663 char *string;
664 while (token != NULL)
llbe2bdbd2022-06-14 02:40:33 +0000665 {
666 if(argc == 5)
667 {
668 if(NULL == argv[1])
669 {
670 return 9002;
671 }
672 int lengh = strlen(argv[1]);
673 memcpy(buf, argv[1], lengh);
674 delete_char(buf, '"');
675 RLOGD("too many phone number return\n");
676 return 0;
677 }
lle1d5d7c2022-01-18 12:34:30 +0000678 string = token;
679 argv[argc++] = string;
680 token = strtok(NULL, ",");
681 }
llbe2bdbd2022-06-14 02:40:33 +0000682 if(NULL == argv[1])
683 {
684 return 9001;
685 }
lle1d5d7c2022-01-18 12:34:30 +0000686 int lengh = strlen(argv[1]);
687 memcpy(buf, argv[1], lengh);
lle1d5d7c2022-01-18 12:34:30 +0000688 delete_char(buf, '"');
ll1651f342022-06-06 10:13:48 +0800689 return 0;
lle1d5d7c2022-01-18 12:34:30 +0000690 }
llbe2bdbd2022-06-14 02:40:33 +0000691 return 9001;
lle1d5d7c2022-01-18 12:34:30 +0000692 }
lle1d5d7c2022-01-18 12:34:30 +0000693}
694
695int lynq_query_phone_number(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700696 if(g_lynq_sim_init_flag == 0)
697 {
698 return -1;
699 }
lle1d5d7c2022-01-18 12:34:30 +0000700 int ret = -1;
701 if(buf == NULL)
702 return ret;
703 int send_num = 0;
704 int recv_num = 0;
705 int len = 0;
706 char res_data[MAX_LEN] = {0};
707 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
708 client_t.paramLen = 1;
709 client_t.uToken = Global_uToken;
710 sprintf(client_t.param, "%s\n", "AT+CNUM");
llab0f3e12022-07-20 11:59:51 +0000711 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000712 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
713 if(send_num < 0)
714 {
715 RLOGD("sendto error:");
716 return ret;
717 }
718 //get data msg
719 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000720 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000721 if(recv_num < 0 || recv_num == 0)
722 {
723 RLOGD("recvfrom step2 fail:");
724 return recv_num;
725 }
726 Parcel p;
727 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
728 p.setDataPosition(0);
729 int num = -1;
730 if(p.dataAvail() > 0)
731 {
llb1fc9212022-04-12 03:02:01 +0000732 char test[128] = {0};
lle1d5d7c2022-01-18 12:34:30 +0000733 char *argv[5] = {0};
734 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800735 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000736 p.readInt32(&request);
737 p.readInt32(&slot_id);
738 p.readInt32(&error1);
739 p.readInt32(&num);
740 if(num == -1){
741 }else{
742 p.read(test, num);
ll1651f342022-06-06 10:13:48 +0800743 num = parse_param(test, argv, buf);
744 return num;
lle1d5d7c2022-01-18 12:34:30 +0000745 }
746 }
747 return error1;
748}
rjw5d2a50e2022-02-28 15:01:49 +0800749
ll4c5c6b72022-03-31 15:27:23 +0800750/**
751 * @brief To handle comma-separated strings, take the character before the first comma eg:123456,78 ->123456
752 *
753 * @param buf Type:[IN]
754 */
755static void parse_imei(char buf[])
756{
757 if(NULL == buf)
758 {
759 return;
760 }
761 const char s[2] = ",";
762 char *token;
763 token = strtok(buf, s);
764 return;
765}
766
767int lynq_get_imei(char buf[])
ll27dbe752022-08-10 00:33:52 -0700768{
769 if(g_lynq_sim_init_flag == 0)
770 {
771 return -1;
772 }
llfcd43492022-03-10 09:01:50 +0000773 int ret = -1;
774 if(buf == NULL)
775 return ret;
776 int send_num = 0;
777 int recv_num = 0;
778 int len = 0;
ll4c5c6b72022-03-31 15:27:23 +0800779 lynq_client_t client_t1;
780 memset(&client_t1, 0, sizeof(client_t1) );
781 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
782 client_t1.paramLen = 0;
783 client_t1.uToken = Global_uToken;
llfcd43492022-03-10 09:01:50 +0000784 char res_data[MAX_LEN] = {0};
ll4c5c6b72022-03-31 15:27:23 +0800785 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000786 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800787 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
llfcd43492022-03-10 09:01:50 +0000788 if(send_num < 0)
789 {
790 RLOGD("sendto error:");
ll4c5c6b72022-03-31 15:27:23 +0800791 return send_num;
llfcd43492022-03-10 09:01:50 +0000792 }
ll4c5c6b72022-03-31 15:27:23 +0800793 //get data msg
llfcd43492022-03-10 09:01:50 +0000794 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000795 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llfcd43492022-03-10 09:01:50 +0000796 if(recv_num < 0 || recv_num == 0)
797 {
798 RLOGD("recvfrom step2 fail:");
799 return recv_num;
800 }
801 Parcel p;
802 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
803 p.setDataPosition(0);
ll4c5c6b72022-03-31 15:27:23 +0800804 int num = 0;
llfcd43492022-03-10 09:01:50 +0000805 if(p.dataAvail() > 0)
ll4c5c6b72022-03-31 15:27:23 +0800806 {
llfcd43492022-03-10 09:01:50 +0000807 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800808 p.readInt32(&solicited_token);
llfcd43492022-03-10 09:01:50 +0000809 p.readInt32(&request);
810 p.readInt32(&slot_id);
811 p.readInt32(&error1);
ll4c5c6b72022-03-31 15:27:23 +0800812 if(!error1){
813 p.readInt32(&num);
814 char * test = lynqStrdupReadString(p);
815 parse_imei(test);
816 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800817 free(test);
llfcd43492022-03-10 09:01:50 +0000818 }
819 }
820 return error1;
821}
822
rjw5d2a50e2022-02-28 15:01:49 +0800823static int judge(int slot){
824 switch(slot){
825 case 0:
826 return -1;
827 case 1:
828 return -1;
829 }
830 return 0;
831}
832
rjw5d2a50e2022-02-28 15:01:49 +0800833int lynq_switch_card(int slot){
ll27dbe752022-08-10 00:33:52 -0700834 if(g_lynq_sim_init_flag == 0)
835 {
836 return -1;
837 }
rjw5d2a50e2022-02-28 15:01:49 +0800838 int ret = -1;
839 if(!judge(slot))
840 return ret;
841 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800842 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
843 client_t.paramLen = 1;
844 client_t.uToken = Global_uToken;
845 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000846 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800847 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
848 if(send_num < 0)
849 {
850 RLOGD("sendto error:");
851 return send_num;
852 }
llab0f3e12022-07-20 11:59:51 +0000853 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800854 return 0;
855}
ll887a0172022-03-09 03:13:31 +0000856
857int lynq_screen(int num){
ll27dbe752022-08-10 00:33:52 -0700858 if(g_lynq_sim_init_flag == 0)
859 {
860 return -1;
861 }
ll887a0172022-03-09 03:13:31 +0000862 int ret = -1;
863 if(!judge(num))
864 return ret;
865 int send_num = 0;
ll887a0172022-03-09 03:13:31 +0000866 client_t.request = RIL_REQUEST_SCREEN_STATE;
867 client_t.paramLen = 1;
868 client_t.uToken = Global_uToken;
869 sprintf(client_t.param, "%d\n", num);
llab0f3e12022-07-20 11:59:51 +0000870 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000871 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
872 if(send_num < 0)
873 {
874 RLOGD("sendto error:");
875 return send_num;
876 }
llab0f3e12022-07-20 11:59:51 +0000877 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000878 return 0;
879}
llba425bd2022-03-17 02:23:00 +0000880
881/**
882 * @brief Check whether the input is valid for lynq_req_sim_io api
883 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
884 * type: [IN] list[1]:EF id(fileid)
885 * type: [IN] list[2]:offset(p1)
886 * type: [IN] list[3]:offset(p2)
887 * type: [IN] list[4]:response len,sometimes needn't care(p3)
888 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
889 type: [IN] Path is in hex asciii format eg "7f205f70"
890 type: [IN] Path must always be provided.
891 * @param data type: [IN] May be NULL
892 * @param pin2 type: [IN] May be NULL
893 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
894 * @param sw type: [OUT]
895 * @param simResponse type: [OUT] response
896 * @return int
897 */
898static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
899{
llba425bd2022-03-17 02:23:00 +0000900 if(list == NULL)
901 {
902 return -1;
903 }
904 if(path == NULL)
905 {
906 return -1;
907 }
908 if(sw == NULL){
909 return -1;
910 }
911 if(simResponse == NULL){
912 return -1;
913 }
914 if(data == NULL)
915 {
916 memcpy(data_buf, "null", 4);
917 }
918 else
919 {
920 bzero(data_buf,32);
921 memcpy(data_buf, data, strlen(data));
922 }
923 if(pin2 == NULL)
924 {
925 memcpy(pin2_buf, "null", 4);
926 }
927 else
928 {
929 bzero(pin2_buf,32);
930 memcpy(pin2_buf, data, strlen(data));
931 }
932 if(aidPtr == NULL)
933 {
934 memcpy(aidPtr_buf, "null", 4);
935 }
936 else
937 {
938 bzero(aidPtr_buf,32);
939 memcpy(aidPtr_buf, data, strlen(data));
940 }
941 return 0;
942}
943
944int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
ll27dbe752022-08-10 00:33:52 -0700945{
946 if(g_lynq_sim_init_flag == 0)
947 {
948 return -1;
949 }
llba425bd2022-03-17 02:23:00 +0000950 int ret = -1;
951 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
952 {
953 return ret;
954 }
955 int send_num = 0;
956 int recv_num = 0;
957 char res_data[MAX_LEN] = {0};
llba425bd2022-03-17 02:23:00 +0000958 client_t.request = RIL_REQUEST_SIM_IO;
959 client_t.paramLen = 9;
960 client_t.uToken = Global_uToken;
961 sprintf(client_t.param, "%d %d %s %d %d %d %s %s %s\n", list[0], list[1], path, list[2], list[3], list[4], data_buf, pin2_buf, aidPtr_buf);
llab0f3e12022-07-20 11:59:51 +0000962 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +0000963 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
964 if(send_num < 0)
965 {
966 RLOGD("sendto error:");
967 return send_num;
968 }
969 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000970 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +0000971 if(recv_num < 0 || recv_num == 0)
972 {
973 RLOGD("recvfrom step2 fail:");
974 return recv_num;
975 }
976 Parcel p;
977 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
978 p.setDataPosition(0);
llba425bd2022-03-17 02:23:00 +0000979 if(p.dataAvail() > 0)
llb15599d2022-04-01 07:50:08 +0000980 {
llba425bd2022-03-17 02:23:00 +0000981 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800982 p.readInt32(&solicited_token);
llba425bd2022-03-17 02:23:00 +0000983 p.readInt32(&request);
984 p.readInt32(&slot_id);
985 p.readInt32(&error1);
986 if(!error1)
987 {
988 p.readInt32(&sw[0]);
989 p.readInt32(&sw[1]);
990 char * test = lynqStrdupReadString(p);
991 memcpy(simResponse, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800992 free(test);
llba425bd2022-03-17 02:23:00 +0000993 }
994
995 }
996 return error1;
997}
llb15599d2022-04-01 07:50:08 +0000998
999/**
1000 * @brief handle shutdown buf
1001 * @param options type: [IN]My Param doc
1002 * @param time type: [IN]My Param doc
1003 * @param message type: [IN]My Param doc
1004 */
1005static void handle_shutdown_buf(char options[], char time[], char message[])
1006{
1007 if(NULL == options)
1008 {
1009 bzero(options_buf, 32);
1010 memcpy(options_buf," ", 1);
1011 }
1012 else
1013 {
1014 memcpy(options_buf,options, strlen(options));
1015 }
1016 if(NULL == time)
1017 {
1018 bzero(time_buf, 32);
1019 memcpy(time_buf," ", 1);
1020 }
1021 else
1022 {
1023 memcpy(time_buf, time, strlen(time));
1024 }
1025 if(NULL == message)
1026 {
1027 bzero(message_buf, 32);
1028 memcpy(message_buf," ", 1);
1029 }
1030 else
1031 {
1032 memcpy(message_buf, message, strlen(message));
1033 }
1034}
1035
1036int lynq_shutdown(char options[], char time[], char message[])
1037{
1038 char cmd[128] = {0};
1039 handle_shutdown_buf(options, time, message);
1040 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
1041 system(cmd);
1042 return 0;
1043}
1044
1045int lynq_get_version(char buf[])
1046{
1047 FILE * fp;
1048 char buffer[128];
1049 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
1050 fp = popen(buffer, "r");
1051 fgets(buffer, sizeof(buffer), fp);
1052 memcpy(buf, buffer, strlen(buffer));
1053 buf[strlen(buffer)] = '\0';
1054 pclose(fp);
1055 return 0;
1056}
lle1d5d7c2022-01-18 12:34:30 +00001057#if FLAG_TESS
1058int lynq_query_operator(char buf[]){
1059 int32_t token = -1;
1060 if(buf == NULL)
1061 return token;
1062 char msg_imsi[20] = {0};
1063 memset(msg_imsi,0,sizeof(msg_imsi));
1064 token = lynq_get_imsi(msg_imsi);
1065 if(strlen(msg_imsi) != 0){
1066 FindOperator *ope_command = NULL;
1067 ope_command = find_ope_command(msg_imsi, findOperator);
1068 if(ope_command){
1069 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
1070 buf[strlen(ope_command->buf)] = '\0';
1071 }
1072 else{
1073 /*more*/
1074 char mccmnc[5] = {0};
1075 memcpy(buf, msg_imsi, 5);
1076 buf[5] = '\0';
1077 /*more*/
1078 }
1079 return token;
1080 }
1081 else{
1082 //msg->base.e = err;
1083 const char *test = "please insert sim card";
1084 memcpy(buf, test, strlen(test));
1085 return token;
1086 }
1087}
1088FindOperator findOperator[] = {
1089#include "operator.h"
1090};
1091
1092static FindOperator*find_ope_command (char *name,FindOperator *Class){
1093 if(name == NULL || Class == NULL){
1094 return ((FindOperator *)NULL);
1095 }
1096 register int i;
1097 for (i = 0; Class[i].MCCMCN; i++)
1098 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
1099 return (&Class[i]);
1100 return ((FindOperator *)NULL);
1101}
1102
1103#endif