blob: 8ed30f49a82b605d2e4c5d811a0af03fc531fd1e [file] [log] [blame]
b.liu87afc4c2024-08-14 17:33:45 +08001#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <errno.h>
5#include <sys/socket.h>
6#include <sys/un.h>
7#include <netinet/in.h>
8#include <pthread.h>
9#include <sys/epoll.h>
10#include <fcntl.h>
11#include <signal.h>
12
13#include "mbtk_type.h"
14#include "mbtk_ril.h"
15#include "atchannel.h"
16#include "at_tok.h"
17#include "mbtk_utils.h"
18#include "ril_info.h"
19
b.liub171c9a2024-11-12 19:23:29 +080020void ril_rsp_pack_send(ATPortType_enum port, int fd, int ril_id, int msg_index, const void* data, int data_len);
b.liu87afc4c2024-08-14 17:33:45 +080021
22/*
23AT+CMGF?
24+CMGF: 0
25
26OK
27
28*/
b.liub171c9a2024-11-12 19:23:29 +080029static int req_cmgf_get(ATPortType_enum port, int *state, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +080030{
31 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +080032// char *tmp_ptr = NULL;
b.liub171c9a2024-11-12 19:23:29 +080033 int err = at_send_command_singleline(port, "AT+CMGF?", "", &response);
b.liu87afc4c2024-08-14 17:33:45 +080034
35 if (err < 0 || response->success == 0 || !response->p_intermediates){
36 *cme_err = at_get_cme_error(response);
37 goto exit;
38 }
39
40 char *line = response->p_intermediates->line;
41 printf("req_cmgf_get() ---line:%s\n", line);
42 char* ptr = strstr(line, "+CMGF: ");
43 printf("req_cmgf_get() ---ptr:%s\n",ptr);
44 if(ptr)
45 {
46 *state = atoi(ptr + strlen("+CMGF: "));
47 }
48 else
49 {
50 err = -1;
51 }
52exit:
53 at_response_free(response);
54 return err;
55}
56
57/*
58AT+CMGF=0"
59or
60AT+CMGF=1"
61
62OK
63*/
b.liub171c9a2024-11-12 19:23:29 +080064static int req_cmgf_set(ATPortType_enum port, int state, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +080065{
b.liu62240ee2024-11-07 17:52:45 +080066 LOGD("req_cmgf_set()-------------start");
67 LOGD("state:%d",state);
b.liu87afc4c2024-08-14 17:33:45 +080068 ATResponse *response = NULL;
69 char cmd[30] = {0};
70 if(state)
71 {
72 strcpy(cmd, "AT+CMGF=1");
73 }
74 else
75 {
76 strcpy(cmd, "AT+CMGF=0");
77 }
78
b.liu62240ee2024-11-07 17:52:45 +080079 LOGD("req_cmgf_set()----cmd:%s", cmd);
b.liub171c9a2024-11-12 19:23:29 +080080 int err = at_send_command(port, cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +080081
82 if (err < 0 || response->success == 0) {
83 *cme_err = at_get_cme_error(response);
84 goto exit;
85 }
86
87 err = 0;
88exit:
89 at_response_free(response);
90 return err;
91}
92
93/*set AT+CNMI=1,2*/
b.liub171c9a2024-11-12 19:23:29 +080094static int req_cnmi_set(ATPortType_enum port, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +080095{
96 printf("req_cnmi_set()-------------start3\n");
97 ATResponse *response = NULL;
98 char cmd[30] = {0};
99
100 strcpy(cmd, "AT+CNMI=1,2");
101
102 printf("req_cnmi_set()----cmd:%s\n", cmd);
b.liub171c9a2024-11-12 19:23:29 +0800103 int err = at_send_command(port, cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800104
105 if (err < 0 || response->success == 0) {
106 printf("err:%d, response->success:%d \n", err, response->success);
107 *cme_err = at_get_cme_error(response);
108 goto exit;
109 }
110
111 err = 0;
112exit:
113 at_response_free(response);
114 printf("exit,err:%d\n", err);
115 return err;
116}
117
118/*
119AT+CPMS?
120
121+CPMS: "SM",15,50,"SM",15,50,"SM",15,50
122
123OK
124
125*/
b.liub171c9a2024-11-12 19:23:29 +0800126static int req_cpms_get(ATPortType_enum port, char *reg, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800127{
128 printf("req_cpms_get------------start(3)\n");
129 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800130// char *tmp_ptr = NULL;
b.liub171c9a2024-11-12 19:23:29 +0800131 int err = at_send_command_singleline(port, "AT+CPMS?", "", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800132
133 if (err < 0 || response->success == 0 || !response->p_intermediates){
134 *cme_err = at_get_cme_error(response);
135 goto exit;
136 }
137
138 ATLine* lines_ptr = response->p_intermediates;
139 char *line = NULL;
140 int len = 0;
141 while(lines_ptr)
142 {
143 line = lines_ptr->line;
144 if(line ==NULL)
145 {
146 printf("line is null----------------------\n");
147 }
148
149 printf("-----------line:%s, strlen:%d, len:%d----------\n", line, strlen(line), len);
150 memcpy(reg+len, line, strlen(line));
151 len += strlen(line);
152 lines_ptr = lines_ptr->p_next;
153 }
154
155 printf("cpms_get()------reg:%s\n", reg);
156
157exit:
158 at_response_free(response);
159 return err;
160}
161
162
163
164/*
165AT+CPMS=<mem1>[,<mem2>[,<mem3>]]
166AT+CPMS="ME","ME","ME"
167
168+CPMS: 14,50,14,50,14,50
169
170OK
171
172*/
b.liub171c9a2024-11-12 19:23:29 +0800173static int req_cpms_set(ATPortType_enum port, const char *mem, char *reg, int len, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800174{
175 printf("req_cpms_set(2)----------------start\n");
176 printf("mem:%s\n", mem);
177 ATResponse *response = NULL;
178 char cmd[30] = {0};
179 int err = 0;
180 char data[20] = {0};
181
182 if(mem != NULL)
183 {
184 memcpy(data, mem, len);
185 sprintf(cmd, "AT+CPMS=%s", data);
186 }
187 else{
188 printf("mem is null\n");
189 }
190
191 printf("cmd:%s,data:%s---------\n", cmd,data);
192
193 if(strlen(cmd) > 8)
194 {
b.liub171c9a2024-11-12 19:23:29 +0800195 err = at_send_command_multiline(port, cmd, "+CPMS:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800196 if (err < 0 || response->success == 0){
197 *cme_err = at_get_cme_error(response);
198 goto exit;
199 }
200
201 char *line = response->p_intermediates->line;
202 printf("line:%s, len:%d\n", line, strlen(line));
203
204 memcpy(reg, line, strlen(line));
205
206 printf("cpms_reg:%s\n", reg);
207 }
208 err = 0;
209exit:
210 printf("goto exit do");
211 at_response_free(response);
212 return err;
213}
214
215/*
216if PDU mode (+CMGF=0):
217 AT+CMGS=<length><CR>
218PDU is given<ctrl-Z/ESC>
219if text mode (+CMGF=1):
220 AT+CMGS=<da>[,<toda>]<CR>
221text is entered<ctrl-Z/ESC>
222
223 AT+CMGS=15775690697,hello world
224
225
226*/
r.xiaoed208552024-11-26 23:11:40 -0800227#define MBTK_AT_MAX_SMS_NUM 4
228#define MBTK_AT_SMS_MAX_LEN 160*MBTK_AT_MAX_SMS_NUM
b.liub171c9a2024-11-12 19:23:29 +0800229static int req_cmgs_set(ATPortType_enum port, char *cmgs, char *reg, int len, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800230{
b.liu62240ee2024-11-07 17:52:45 +0800231 LOGD("req_cmgs_set()----------------start");
232 LOGD("cmgs:%s", cmgs);
b.liu87afc4c2024-08-14 17:33:45 +0800233 ATResponse *response = NULL;
234 char cmd[30] = {0};
r.xiaoed208552024-11-26 23:11:40 -0800235 char data[MBTK_AT_SMS_MAX_LEN] = {0};
b.liu87afc4c2024-08-14 17:33:45 +0800236 char pnum[20] = {0};
237 char *ptr = cmgs;
238 int err = 0;
b.liu62240ee2024-11-07 17:52:45 +0800239// int data_len = 0;
b.liu87afc4c2024-08-14 17:33:45 +0800240
241 char *src = strstr(cmgs, ",");
242 if(src != NULL)
243 {
b.liu87afc4c2024-08-14 17:33:45 +0800244 memcpy(pnum, ptr, src - ptr);
b.liu87afc4c2024-08-14 17:33:45 +0800245 src++;
246 int data_len = 0;
247 data_len = len - (src - ptr);
248 memcpy(data, src, data_len);
b.liu87afc4c2024-08-14 17:33:45 +0800249 }
b.liu62240ee2024-11-07 17:52:45 +0800250 else
251 {
252 LOGD("cmgs param is error");
253 return -1;
254 }
255 LOGD("num:%s", pnum);
256 LOGD("data:%s", data);
b.liu87afc4c2024-08-14 17:33:45 +0800257
258 sprintf(cmd, "AT+CMGS=%s", pnum);
b.liu62240ee2024-11-07 17:52:45 +0800259 LOGD("cmd:%s", cmd);
b.liu87afc4c2024-08-14 17:33:45 +0800260
261 if(strlen(cmd) > 0)
262 {
b.liub171c9a2024-11-12 19:23:29 +0800263 int err = at_send_command_sms(port, cmd, data, "+CMGS: ", &response);
b.liu62240ee2024-11-07 17:52:45 +0800264 LOGD("err:%d, response:%d", err, response->success);
b.liu87afc4c2024-08-14 17:33:45 +0800265
266 if (err < 0 || response->success == 0) {
267 *cme_err = at_get_cme_error(response);
268 goto exit;
269 }
270 char *line;
271 line = response->p_intermediates->line;
272 memcpy(reg, line, strlen(line));
b.liu62240ee2024-11-07 17:52:45 +0800273 LOGD("line:%s", line);
b.liu87afc4c2024-08-14 17:33:45 +0800274
275 }
276 err = 0;
277exit:
278 at_response_free(response);
279 return err;
280}
281
b.liub171c9a2024-11-12 19:23:29 +0800282static int req_cmgw_set(ATPortType_enum port, char *cmgw,int len, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800283{
284 printf("req_cmgw_set()----------------start\n");
285 printf("cmgw:%s\n", cmgw);
286 ATResponse *response = NULL;
287 char cmd[30] = {0};
288 char data[218] = {0};
289 char pnum[13] = {0};
290 char *ptr = cmgw;
291 int err = 0;
292
293 char *src = strstr(cmgw, ",");
294 if(src != NULL)
295 {
296 memcpy(pnum, ptr, src - ptr);
297 src++;
298 int data_len = 0;
299 data_len = len - (src - ptr);
300 memcpy(data, src, data_len);
301 }
302
303 sprintf(cmd, "AT+CMGW=%s", pnum);
304 printf("cmd:%s,data:%s---------\n", cmd,data);
305
306 if(strlen(cmd) > 0)
307 {
b.liub171c9a2024-11-12 19:23:29 +0800308 int err = at_send_command_sms(port, cmd, data, "+CMGW: ", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800309 printf("err:%d, response:%d\n", err, response->success);
310
311 if (err < 0 || response->success == 0) {
312 *cme_err = at_get_cme_error(response);
313 goto exit;
314 }
315 char *line;
316 line = response->p_intermediates->line;
317 printf("line:%s\n", line);
318 }
319 err = 0;
320exit:
321 at_response_free(response);
322 return err;
323}
324
325/*
326AT+CMGD=25
327OK
328
329+MMSG: 1, 0
330*/
b.liub171c9a2024-11-12 19:23:29 +0800331static int req_cmgd_set(ATPortType_enum port, char *cmgd, int len, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800332{
333 printf("0req_cmgd_set()--------------start\n");
334 printf("cmgd:%s\n", cmgd);
335 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800336 char cmd[500] = {0};
b.liu87afc4c2024-08-14 17:33:45 +0800337 char data[218] = {0};
b.liu62240ee2024-11-07 17:52:45 +0800338// char pnum[13] = {0};
339// char *ptr = cmgd;
b.liu87afc4c2024-08-14 17:33:45 +0800340 int err = 0;
341
342 memcpy(data, cmgd, len );
343 sprintf(cmd, "AT+CMGD=%s", data);
344 printf("cmd:%s,data:%s---------\n", cmd,data);
345
346 if(strlen(cmd) > 0)
347 {
b.liub171c9a2024-11-12 19:23:29 +0800348 int err = at_send_command(port, cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800349 if (err < 0 || response->success == 0) {
350 *cme_err = at_get_cme_error(response);
351 goto exit;
352 }
353
354// Format problem caused the crash
355// char *line;
356// line = response->p_intermediates->line;
357// printf("line:%s\n", line);
358 }
359 err = 0;
360exit:
361 at_response_free(response);
362 return err;
363}
364
365/*
366AT+CMGD=?
367
368+CMGD: (0,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),(0-4)
369
370OK
371
372*/
b.liub171c9a2024-11-12 19:23:29 +0800373static int req_cmgd_get(ATPortType_enum port, char *reg, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800374{
375 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800376// char *tmp_ptr = NULL;
b.liub171c9a2024-11-12 19:23:29 +0800377 int err = at_send_command_singleline(port, "AT+CMGD=?", "+CMGD:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800378
379 if (err < 0 || response->success == 0 || !response->p_intermediates){
380 *cme_err = at_get_cme_error(response);
381 goto exit;
382 }
383
384 char *line = response->p_intermediates->line;
385
386 const char* start = strchr(line, '(');
387 const char* end = strchr(line, ')');
388
389 if (start && end && end > start)
390 {
391 int len_t = end - start - 1;
392 char substr_t[len_t + 1];
393
394 strncpy(substr_t, start + 1, len_t);
395 substr_t[len_t] = '\0';
396 strncpy(reg, substr_t, len_t);
397 }
398 else
399 {
400 strcpy(reg, "");
401 }
402
403exit:
404 at_response_free(response);
405 return err;
406}
407
408
409/*
410AT+CMGL="ALL"
411
412+CMGL: 1,"REC READ","10658678",,"22.11.14 10:41:44 GMT+8"
413
41456DB5DDD62
415
416+CMGL: 2,"STO UNSENT","18927467953"
417hello world
418
419*/
420
b.liub171c9a2024-11-12 19:23:29 +0800421static int req_cmgl_set(ATPortType_enum port, const char *cmgl, char *reg, int len, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800422{
423 printf("req_cmgl_set(2)-----------------start\n");
424 printf("cmgl:%s\n", cmgl);
425 ATResponse *response = NULL;
426 char cmd[30] = {0};
427 char data[218] = {0};
428 char index_data[256] = {0};
429 int s_index = 0, g_index = 0;
430 bool index_flag = false;
431 char *ptr_index = index_data;
b.liu62240ee2024-11-07 17:52:45 +0800432// char phone[50];
b.liu87afc4c2024-08-14 17:33:45 +0800433 char number[5] = {0};
434 int err = 0;
435
436 memcpy(data, cmgl, len);
437
438 char *ptr1 = data;
439 char *ptr2 = strstr(data, ",");
440 if(ptr2 != NULL)
441 {
442 memcpy(number,ptr1, ptr2-ptr1 );
443 s_index = atoi(number);
444 if(s_index == 0)
445 {
446 index_flag = TRUE;
447 memcpy(ptr_index, "+CMGL:", strlen("+CMGL:"));
448 }
449 memset(number, 0, sizeof(number));
450 ptr2++;
451 }else{
452 printf("cmgl set data is error\n eg:index,data\n");
453 return -1;
454 }
455
456 sprintf(cmd, "AT+CMGL=%s", ptr2);
457 printf("cmd:%s\n", cmd);
458
459 ptr1 = NULL;
460 ptr2 = NULL;
461
462 if(strlen(cmd) > 0)
463 {
b.liub171c9a2024-11-12 19:23:29 +0800464 err = at_send_command_multiline(port, cmd, "", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800465 if (err < 0 || response->success == 0 || !response->p_intermediates){
466 *cme_err = at_get_cme_error(response);
467 printf("at_send_command_multiline() is err-----------------\n");
468 goto exit;
469 }
470
471 ATLine* lines_ptr = response->p_intermediates;
472 char *line = NULL;
473 int reg_len = 0;
474 bool flag = false;
475 while(lines_ptr)
476 {
477 line = lines_ptr->line;
478 if(line ==NULL)
479 {
480 printf("line is null----------------------\n");
481 }
482
483 printf("-----line:%s\n", line);
484 if(!flag)
485 {
486 ptr1 = strstr(line, "+CMGL: ");
487 if(ptr1 != NULL)
488 {
489 ptr1 += 7;
490 ptr2 = strstr(line, ",");
491 memcpy(number,ptr1, ptr2-ptr1 );
492 printf("number:%s, ptr1:%s, ptr2:%s\n", number, ptr1, ptr2);
493 g_index = atoi(number);
494 if(index_flag)
495 {
496 sprintf(ptr_index+strlen(ptr_index), "%d,", g_index);
497 }
498 }
499 //if( g_index == s_index)
500 if( g_index == s_index && !index_flag)
501 {
502 printf("g_index == s_index, g_index:%d,s_index:%d\n", g_index, s_index);
503 flag = true;
504 }
505 }
506 if(flag && reg_len <=1024)
507 {
508 memcpy(reg+reg_len, line, strlen(line));
509 printf("-----memcpy------reg:%s----------\n", reg);
510 printf("len:%d\n", reg_len);
511 reg_len += strlen(line);
512 }
513
514 lines_ptr = lines_ptr->p_next;
515 }
516 }
517
518 if(index_flag)
519 {
b.liu62240ee2024-11-07 17:52:45 +0800520 // memset(reg, 0, sizeof(reg));
521 memcpy(reg, ptr_index, strlen(ptr_index) + 1);
b.liu87afc4c2024-08-14 17:33:45 +0800522 }
523 err = 0;
524exit:
525 at_response_free(response);
526 printf("req_cmgl_set()-----------------end\n");
527 return err;
528}
529
530/*
531at+csca?
532+CSCA: "+8613800280500",145
533OK
534*/
b.liub171c9a2024-11-12 19:23:29 +0800535static int req_csca_get(ATPortType_enum port, char *req, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800536{
537 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800538// char *tmp_ptr = NULL;
b.liub171c9a2024-11-12 19:23:29 +0800539 int err = at_send_command_singleline(port, "AT+CSCA?", "", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800540
541 if (err < 0 || response->success == 0 || !response->p_intermediates){
542 *cme_err = at_get_cme_error(response);
543 goto exit;
544 }
545
546 char *line = response->p_intermediates->line;
547 printf("req_csca_get() ---line:%s\n", line);
548 char* ptr = strstr(line, "+CSCA: ");
549 printf("req_csca_get() ---ptr:%s\n",ptr);
550 if(ptr)
551 {
552 memcpy(req, line, strlen(line));
553 printf("err:%d, req:%s\n", err, req);
554 err = 0;
555 }
556 else
557 {
558 err = -1;
559 }
560
561exit:
562 at_response_free(response);
563 return err;
564}
565
b.liub171c9a2024-11-12 19:23:29 +0800566static int req_csca_set(ATPortType_enum port, char *csca, int len, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800567{
568 printf("req_csca_set()--------------start\n");
569 printf("csca:%s\n", csca);
570 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800571 char cmd[500] = {0};
b.liu87afc4c2024-08-14 17:33:45 +0800572 char data[218] = {0};
b.liu62240ee2024-11-07 17:52:45 +0800573// char pnum[13] = {0};
574// char *ptr = csca;
b.liu87afc4c2024-08-14 17:33:45 +0800575 int err = 0;
576
577 memcpy(data, csca, len);
578 sprintf(cmd, "AT+CSCA=%s", data);
579 printf("cmd:%s,data:%s---------\n", cmd,data);
580
581 if(strlen(cmd) > 0)
582 {
b.liub171c9a2024-11-12 19:23:29 +0800583 int err = at_send_command(port, cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800584 if (err < 0 || response->success == 0) {
585 *cme_err = at_get_cme_error(response);
586 goto exit;
587 }
588
589 // char *line;
590 // line = response->p_intermediates->line;
591 // printf("line:%s\n", line);
592 }
593 err = 0;
594exit:
595 at_response_free(response);
596 return err;
597}
598
b.liub171c9a2024-11-12 19:23:29 +0800599static int req_csmp_set(ATPortType_enum port, char *csmp, int len, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800600{
601 printf("req_csmp_set()-------------------start\n");
602 printf("csmp:%s\n", csmp);
603 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800604 char cmd[500] = {0};
b.liu87afc4c2024-08-14 17:33:45 +0800605 char data[218] = {0};
b.liu62240ee2024-11-07 17:52:45 +0800606// char pnum[13] = {0};
607// char *ptr = csmp;
b.liu87afc4c2024-08-14 17:33:45 +0800608 int err = 0;
609
610 memcpy(data, csmp, len);
611 sprintf(cmd, "AT+CSMP=%s", data);
612 printf("cmd:%s,data:%s---------\n", cmd,data);
613
614 if(strlen(cmd) > 0)
615 {
b.liub171c9a2024-11-12 19:23:29 +0800616 int err = at_send_command(port, cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800617 if (err < 0 || response->success == 0) {
618 *cme_err = at_get_cme_error(response);
619 goto exit;
620 }
621
622 char *line;
623 line = response->p_intermediates->line;
624 printf("line:%s\n", line);
625 }
626 err = 0;
627exit:
628 at_response_free(response);
629 return err;
630}
631
b.liub171c9a2024-11-12 19:23:29 +0800632static int req_cscb_set(ATPortType_enum port, char *cscb,int len, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800633{
634 printf("req_cscb_set()----------------start\n");
635 printf("cscb:%s\n", cscb);
636 ATResponse *response = NULL;
637 char cmd[30] = {0};
638 char data[218] = {0};
b.liu62240ee2024-11-07 17:52:45 +0800639// char pnum[13] = {0};
640// char *ptr = cscb;
b.liu87afc4c2024-08-14 17:33:45 +0800641 int err = 0;
642
643 memcpy(data, cscb, len);
644 sprintf(cmd, "AT+CSCB=%s", cscb);
645 printf("cmd:%s,data:%s---------\n", cmd,data);
646
647 if(strlen(cmd) > 0)
648 {
b.liub171c9a2024-11-12 19:23:29 +0800649 int err = at_send_command(port, cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800650 if (err < 0 || response->success == 0) {
651 *cme_err = at_get_cme_error(response);
652 goto exit;
653 }
654
655 char *line;
656 line = response->p_intermediates->line;
657 printf("line:%s\n", line);
658 }
659 err = 0;
660exit:
661 at_response_free(response);
662 return err;
663}
664
665/*
666AT+CMSS=13
667+CMSS: 81
668OK
669*/
b.liub171c9a2024-11-12 19:23:29 +0800670static int req_cmss_set(ATPortType_enum port, const char *cmss, char *reg, int len, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800671{
672 printf("req_cmss_set()----------------start\n");
673 printf("cmss:%s\n", cmss);
674 ATResponse *response = NULL;
675 char cmd[30] = {0};
676 char data[20] = {0};
677 int err = 0;
678
679 if(cmss != NULL)
680 {
681 memcpy(data, cmss, len);
682 sprintf(cmd, "AT+CMSS=%s", data);
683 // sprintf(cmd, "AT+CMSS=%d", 8);
684 }
685 else{
686 printf("mem is null\n");
687 }
688
689 printf("cmss. cmd:%s\n", cmd);
690
691 if(strlen(cmd) > 8)
692 {
b.liub171c9a2024-11-12 19:23:29 +0800693 err = at_send_command_multiline(port, cmd, "+CMSS:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800694 if (err < 0 || response->success == 0){
695 *cme_err = at_get_cme_error(response);
696 goto exit;
697 }
698
699 char *line = response->p_intermediates->line;
700 printf("line:%s\n", line);
701
702 char *tmp_str = NULL;
703 err = at_tok_nextstr(&line, &tmp_str); // phone_number
704 if (err < 0)
705 {
706 goto exit;
707 }
708 memcpy(reg, tmp_str, strlen(tmp_str));
709 printf("cmss_reg:%s\n", reg);
710 /*
711 int err = at_send_command(cmd, &response);
712
713 if (err < 0 || response->success == 0) {
714 *cme_err = at_get_cme_error(response);
715 goto exit;
716 }
717
718 char *line;
719 line = response->p_intermediates->line;
720 printf("line:%s\n", line);
721 */
722 }
723 err = 0;
724exit:
725 at_response_free(response);
726 return err;
727}
728
729
730/*
731AT+CMGR=1
732+CMGR: "REC READ","10658678",,"22.11.14 10:41:44 GMT+8"
733
73456DB5DDD624B673A62A5FF039003003400310034003500340035003F0073003D0037003800680061006C00450066
735
736OK
737*/
b.liub171c9a2024-11-12 19:23:29 +0800738static int req_cmgr_set(ATPortType_enum port, int index, char *reg, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800739{
740 printf("0req_cmgr_set()-------------------start\n");
741 printf("index:%d\n", index);
742 ATResponse *response = NULL;
743 char cmd[30] = {0};
744 int err = 0;
745 sprintf(cmd, "AT+CMGR=%d", index);
746
747 printf("req_cmgr_set()----cmd:%s\n", cmd);
748
749 if(strlen(cmd) > 0)
750 {
b.liub171c9a2024-11-12 19:23:29 +0800751 err = at_send_command_multiline(port, cmd, "", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800752 if (err < 0 || response->success == 0 || !response->p_intermediates){
753 *cme_err = at_get_cme_error(response);
754 printf("at_send_command_multiline() is err-----------------\n");
755 goto exit;
756 }
757
758 ATLine* lines_ptr = response->p_intermediates;
759 char *line = NULL;
760 int reg_len = 0;
761 while(lines_ptr)
762 {
763 line = lines_ptr->line;
764 if(line ==NULL)
765 {
766 printf("line is null----------------------\n");
767 }
768
769 if(reg_len > 0)
770 {
771 memcpy(reg+reg_len, "\r\n", strlen("\r\n"));
772 reg_len += strlen("\r\n");
773 }
774 memcpy(reg+reg_len, line, strlen(line));
775 printf("-----memcpy------reg:%s----------\n", reg);
776 printf("len:%d\n", reg_len);
777 reg_len += strlen(line);
778 lines_ptr = lines_ptr->p_next;
779 }
780 }
781
782 err = 0;
783exit:
784 at_response_free(response);
785 return err;
786}
787
788
789//void net_list_free(void *data);
790// Return MBTK_INFO_ERR_SUCCESS,will call pack_error_send() to send RSP.
791// Otherwise, do not call pack_error_send().
792mbtk_ril_err_enum sms_pack_req_process(sock_cli_info_t* cli_info, ril_msg_pack_info_t* pack)
793{
794 mbtk_ril_err_enum err = MBTK_RIL_ERR_SUCCESS;
795 int cme_err = MBTK_RIL_ERR_CME_NON;
796 switch(pack->msg_id)
797 {
798 case RIL_MSG_ID_SMS_CMGF:
799 {
800 if(pack->data_len == 0 || pack->data == NULL) // Get VoLTE state.
801 {
802 int state;
b.liub171c9a2024-11-12 19:23:29 +0800803 if(req_cmgf_get(cli_info->port, &state, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800804 {
805 if(cme_err != MBTK_RIL_ERR_CME_NON) {
806 err = MBTK_RIL_ERR_CME + cme_err;
807 } else {
808 err = MBTK_RIL_ERR_UNKNOWN;
809 }
810 LOG("Get SMS CMGF fail.");
811 }
812 else
813 {
b.liub171c9a2024-11-12 19:23:29 +0800814 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &state, sizeof(uint8));
b.liu87afc4c2024-08-14 17:33:45 +0800815 }
816 }
817 else // Set VoLTE state.
818 {
819 uint8 mode = *(pack->data);
820 if(pack->data_len != sizeof(uint8) || (mode != 0 && mode != 1))
821 {
822 err = MBTK_RIL_ERR_REQ_PARAMETER;
823 LOG("Set SMS CMGF parameter error.");
824 break;
825 }
826
b.liub171c9a2024-11-12 19:23:29 +0800827 if(req_cmgf_set(cli_info->port, mode, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800828 {
829 if(cme_err != MBTK_RIL_ERR_CME_NON) {
830 err = MBTK_RIL_ERR_CME + cme_err;
831 } else {
832 err = MBTK_RIL_ERR_UNKNOWN;
833 }
834 LOG("Set SMS CMGF fail.");
835 }
836 else
837 {
b.liub171c9a2024-11-12 19:23:29 +0800838 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu87afc4c2024-08-14 17:33:45 +0800839 }
840 }
841 break;
842 }
843 case RIL_MSG_ID_SMS_CNMI:
844 {
845 if(pack->data_len == 0 || pack->data == NULL) // SET at+cnmi=1,2.
846 {
b.liu62240ee2024-11-07 17:52:45 +0800847// int state;
b.liub171c9a2024-11-12 19:23:29 +0800848 if(req_cnmi_set(cli_info->port, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800849 {
850 if(cme_err != MBTK_RIL_ERR_CME_NON) {
851 err = MBTK_RIL_ERR_CME + cme_err;
852 } else {
853 err = MBTK_RIL_ERR_UNKNOWN;
854 }
855 LOG("set sms cnmi fail.");
856 }
857 else
858 {
b.liub171c9a2024-11-12 19:23:29 +0800859 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu87afc4c2024-08-14 17:33:45 +0800860 }
861 }
862 break;
863 }
864 case RIL_MSG_ID_SMS_CPMS:
865 {
866 if(pack->data_len == 0 || pack->data == NULL) // Get VoLTE state.
867 {
868 char reg[100] = {0};
b.liub171c9a2024-11-12 19:23:29 +0800869 if(req_cpms_get(cli_info->port, reg, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800870 {
871 if(cme_err != MBTK_RIL_ERR_CME_NON) {
872 err = MBTK_RIL_ERR_CME + cme_err;
873 } else {
874 err = MBTK_RIL_ERR_UNKNOWN;
875 }
876 LOG("Get SMS CMGF fail.");
877 }
878 else
879 {
b.liub171c9a2024-11-12 19:23:29 +0800880 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, reg, strlen(reg));
b.liu87afc4c2024-08-14 17:33:45 +0800881 }
882 }
883 else // Set VoLTE state.
884 {
885 char *mem = (char*)(pack->data);
886 int len = pack->data_len;
887 char reg[100] = {0};
888 LOGD("mem:%s, len:%d", pack->data, pack->data_len);
889
b.liub171c9a2024-11-12 19:23:29 +0800890 if(req_cpms_set(cli_info->port, mem, reg, len, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800891 {
892 if(cme_err != MBTK_RIL_ERR_CME_NON) {
893 err = MBTK_RIL_ERR_CME + cme_err;
894 } else {
895 err = MBTK_RIL_ERR_UNKNOWN;
896 }
897 LOG("Set SMS CMGF fail.");
898 }
899 else
900 {
901 LOGD("cpms_set success, reg:%s", reg);
b.liub171c9a2024-11-12 19:23:29 +0800902 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, reg, strlen(reg));
b.liu87afc4c2024-08-14 17:33:45 +0800903 }
904 }
905 break;
906 }
907 case RIL_MSG_ID_SMS_CMGS:
908 {
909 if(pack->data_len == 0 || pack->data == NULL) // Get VoLTE state.
910 {
911 err = MBTK_RIL_ERR_UNSUPPORTED;
912 }
913 else // Set VoLTE state.
914 {
915 char *cmgs = (char*)pack->data;
916 int len = pack->data_len;
917 char reg[50] ={0};
918 LOGD("mbtk_sms,cmgs:%s,len:%d", cmgs, len);
919
b.liub171c9a2024-11-12 19:23:29 +0800920 if(req_cmgs_set(cli_info->port, cmgs,reg,len, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800921 {
922 if(cme_err != MBTK_RIL_ERR_CME_NON) {
923 err = MBTK_RIL_ERR_CME + cme_err;
924 } else {
925 err = MBTK_RIL_ERR_UNKNOWN;
926 }
927 LOG("Set SMS CMGF fail.");
928 }
929 else
930 {
b.liub171c9a2024-11-12 19:23:29 +0800931 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, reg, strlen(reg));
b.liu87afc4c2024-08-14 17:33:45 +0800932 }
933 }
934 break;
935 }
936 case RIL_MSG_ID_SMS_CMSS:
937 {
938 if(pack->data_len == 0 || pack->data == NULL) // Get VoLTE state.
939 {
940 err = MBTK_RIL_ERR_UNSUPPORTED;
941 }
942 else // Set VoLTE state.
943 {
944 char *cmss = (char*)pack->data;
945 int len = pack->data_len;
946 char reg[128] = {0};
947 LOGD("mbtk_sms,cmgs:%s, len:%d", cmss, len);
948
b.liub171c9a2024-11-12 19:23:29 +0800949 if(req_cmss_set(cli_info->port, cmss,reg, len, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800950 {
951 if(cme_err != MBTK_RIL_ERR_CME_NON) {
952 err = MBTK_RIL_ERR_CME + cme_err;
953 } else {
954 err = MBTK_RIL_ERR_UNKNOWN;
955 }
956 LOG("Set SMS CMGF fail.");
957 }
958 else
959 {
960 LOGD("req_cmss_set success, reg:%s", reg);
b.liub171c9a2024-11-12 19:23:29 +0800961 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu87afc4c2024-08-14 17:33:45 +0800962 }
963 }
964 break;
965 }
966 case RIL_MSG_ID_SMS_CMGR:
967 {
968 if(pack->data_len == 0 || pack->data == NULL) // Get VoLTE state.
969 {
970 err = MBTK_RIL_ERR_UNSUPPORTED;
971 }
972 else // Set VoLTE state.
973 {
974 uint8 index = *(pack->data);
975 char reg[1024] = {0};
976 if(pack->data_len != sizeof(uint8) )
977 {
978 err = MBTK_RIL_ERR_REQ_PARAMETER;
979 LOG("Set SMS CMGF parameter error.");
980 break;
981 }
982
b.liub171c9a2024-11-12 19:23:29 +0800983 if(req_cmgr_set(cli_info->port, index, reg, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800984 {
985 if(cme_err != MBTK_RIL_ERR_CME_NON) {
986 err = MBTK_RIL_ERR_CME + cme_err;
987 } else {
988 err = MBTK_RIL_ERR_UNKNOWN;
989 }
990 LOG("Set SMS CMGF fail.");
991 }
992 else
993 {
b.liub171c9a2024-11-12 19:23:29 +0800994 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, reg, strlen(reg));
b.liu87afc4c2024-08-14 17:33:45 +0800995 }
996 }
997 break;
998 }
999 case RIL_MSG_ID_SMS_CMGW:
1000 {
1001 if(pack->data_len == 0 || pack->data == NULL) // +CMGW=<oa/da>[,<tooa/toda>[,<stat>]]<CR>
1002 {
1003 err = MBTK_RIL_ERR_UNSUPPORTED;
1004 }
1005 else // Set cmgw data.
1006 {
1007 char *cmgw = (char*)pack->data;
1008 int len = pack->data_len;
1009 LOGD("mbtk_sms,cmgw:%s,len:%d", cmgw, len);
1010
b.liub171c9a2024-11-12 19:23:29 +08001011 if(req_cmgw_set(cli_info->port, cmgw, len, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001012 {
1013 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1014 err = MBTK_RIL_ERR_CME + cme_err;
1015 } else {
1016 err = MBTK_RIL_ERR_UNKNOWN;
1017 }
1018 LOG("Set SMS CMGF fail.");
1019 }
1020 else
1021 {
b.liub171c9a2024-11-12 19:23:29 +08001022 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu87afc4c2024-08-14 17:33:45 +08001023 }
1024 }
1025 break;
1026 }
1027 case RIL_MSG_ID_SMS_CMGD:
1028 {
1029 if(pack->data_len == 0 || pack->data == NULL) // Get VoLTE state.
1030 {
1031 char reg[1024] = {0};
b.liub171c9a2024-11-12 19:23:29 +08001032 if(req_cmgd_get(cli_info->port, reg, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001033 {
1034 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1035 err = MBTK_RIL_ERR_CME + cme_err;
1036 } else {
1037 err = MBTK_RIL_ERR_UNKNOWN;
1038 }
1039 LOG("Get SMS CMGD fail.");
1040 }
1041 else
1042 {
b.liub171c9a2024-11-12 19:23:29 +08001043 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, reg, strlen(reg));
b.liu87afc4c2024-08-14 17:33:45 +08001044 }
1045 }
1046 else // Set VoLTE state.
1047 {
1048 char *cmgd = (char*)pack->data;
1049 int len = pack->data_len;
1050 LOGD("mbtk_sms,cmgs:%s,len:%d", cmgd, len);
1051
b.liub171c9a2024-11-12 19:23:29 +08001052 if(req_cmgd_set(cli_info->port, cmgd,len, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001053 {
1054 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1055 err = MBTK_RIL_ERR_CME + cme_err;
1056 } else {
1057 err = MBTK_RIL_ERR_UNKNOWN;
1058 }
1059 LOG("Set SMS CMGF fail.");
1060 }
1061 else
1062 {
b.liub171c9a2024-11-12 19:23:29 +08001063 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu87afc4c2024-08-14 17:33:45 +08001064 }
1065
1066 }
1067 break;
1068 }
1069 case RIL_MSG_ID_SMS_CMGL:
1070 {
1071 if(pack->data_len == 0 || pack->data == NULL) // Get VoLTE state.
1072 {
1073 err = MBTK_RIL_ERR_UNSUPPORTED;
1074 }
1075 else // Set VoLTE state.
1076 {
1077 char *cmgl = (char*)pack->data;
1078 int len = pack->data_len;
1079 char reg[5*1024] = {0};
1080 char reg1[1024+1] = {0};
1081
b.liub171c9a2024-11-12 19:23:29 +08001082 if(req_cmgl_set(cli_info->port, cmgl, reg, len, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001083 {
1084 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1085 err = MBTK_RIL_ERR_CME + cme_err;
1086 } else {
1087 err = MBTK_RIL_ERR_UNKNOWN;
1088 }
1089 LOG("Set SMS CMGF fail.");
1090 }
1091 else
1092 {
1093 memcpy(reg1, reg, 1024);
b.liub171c9a2024-11-12 19:23:29 +08001094 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, reg1, strlen(reg1));
b.liu87afc4c2024-08-14 17:33:45 +08001095 }
1096 }
1097 break;
1098 }
1099 case RIL_MSG_ID_SMS_CSCA:
1100 {
1101 if(pack->data_len == 0 || pack->data == NULL) // Get VoLTE state.
1102 {
1103 char csca[50]={0};
b.liub171c9a2024-11-12 19:23:29 +08001104 if(req_csca_get(cli_info->port, csca, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001105 {
1106 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1107 err = MBTK_RIL_ERR_CME + cme_err;
1108 } else {
1109 err = MBTK_RIL_ERR_UNKNOWN;
1110 }
1111 LOG("Get SMS CSCA fail.");
1112 }
1113 else
1114 {
b.liub171c9a2024-11-12 19:23:29 +08001115 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, csca, strlen(csca));
b.liu87afc4c2024-08-14 17:33:45 +08001116 }
1117 err = MBTK_RIL_ERR_UNSUPPORTED;
1118 }
1119 else // Set VoLTE state.
1120 {
1121 char *csca = (char*)pack->data;
1122 int len = pack->data_len;
1123
b.liub171c9a2024-11-12 19:23:29 +08001124 if(req_csca_set(cli_info->port, csca, len, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001125 {
1126 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1127 err = MBTK_RIL_ERR_CME + cme_err;
1128 } else {
1129 err = MBTK_RIL_ERR_UNKNOWN;
1130 }
1131 LOG("Set SMS CMGF fail.");
1132 }
1133 else
1134 {
b.liub171c9a2024-11-12 19:23:29 +08001135 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu87afc4c2024-08-14 17:33:45 +08001136 }
1137 }
1138 break;
1139 }
1140 case RIL_MSG_ID_SMS_CSMP:
1141 {
1142 if(pack->data_len == 0 || pack->data == NULL) // Get VoLTE state.
1143 {
1144 err = MBTK_RIL_ERR_UNSUPPORTED;
1145 }
1146 else // Set VoLTE state.
1147 {
1148 char *csmp = (char*)pack->data;
1149 int len = pack->data_len;
1150
b.liub171c9a2024-11-12 19:23:29 +08001151 if(req_csmp_set(cli_info->port, csmp,len, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001152 {
1153 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1154 err = MBTK_RIL_ERR_CME + cme_err;
1155 } else {
1156 err = MBTK_RIL_ERR_UNKNOWN;
1157 }
1158 LOG("Set SMS CMGF fail.");
1159 }
1160 else
1161 {
b.liub171c9a2024-11-12 19:23:29 +08001162 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu87afc4c2024-08-14 17:33:45 +08001163 }
1164 }
1165 break;
1166 }
1167 case RIL_MSG_ID_SMS_CSCB:
1168 {
1169 if(pack->data_len == 0 || pack->data == NULL) // Get VoLTE state.
1170 {
1171 err = MBTK_RIL_ERR_UNSUPPORTED;
1172 }
1173 else // Set VoLTE state.
1174 {
1175 char *cscb = (char*)pack->data;
1176 int len = pack->data_len;
1177
b.liub171c9a2024-11-12 19:23:29 +08001178 if(req_cscb_set(cli_info->port, cscb,len, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001179 {
1180 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1181 err = MBTK_RIL_ERR_CME + cme_err;
1182 } else {
1183 err = MBTK_RIL_ERR_UNKNOWN;
1184 }
1185 LOG("Set SMS CMGF fail.");
1186 }
1187 else
1188 {
b.liub171c9a2024-11-12 19:23:29 +08001189 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu87afc4c2024-08-14 17:33:45 +08001190 }
1191 }
1192 break;
1193 }
1194 default:
1195 {
1196 err = MBTK_RIL_ERR_REQ_UNKNOWN;
1197 LOG("Unknown request : %s", id2str(pack->msg_id));
1198 break;
1199 }
1200 }
1201
1202 return err;
1203}
1204
1205
1206
1207
1208