blob: 8d385683202e55ce1e01857658b7578acecebc27 [file] [log] [blame]
hong.liud2417072025-06-27 07:10:37 -07001#include <stdbool.h>
b.liu68a94c92025-05-24 12:53:41 +08002#include <stdio.h>
3#include <stdlib.h>
4#include <stdint.h>
5#include <dlfcn.h>
6#include <time.h>
hong.liud2417072025-06-27 07:10:37 -07007#include "gsw_nw_interface.h"
lichengzhang7715b2f2025-07-19 10:18:21 +08008#include "gsw_log_interface.h"
b.liu68a94c92025-05-24 12:53:41 +08009typedef unsigned short uint16_t;
10typedef unsigned int uint32_t;
11typedef unsigned char uint8_t;
12typedef unsigned short uint16;
13typedef uint32_t sms_client_handle_type;
14typedef int kal_int32;
15
16
17//qser include
18
19
20
21//mbtk include
22typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
23typedef unsigned char uint8;
24
25typedef struct
26{
27 int client_fd;
28 pthread_t read_thread_id;
29 int exit_fd[2];
30 bool is_waitting;
31 pthread_cond_t cond;
32 pthread_mutex_t mutex;
33
34 pthread_mutex_t send_mutex;
35
36 // Temp response data.
37 uint16 info_err;
38 uint16 data_len;
39 void *data;
40
41 //mbtk wyq for server_ready_status add start
42 char server_ready_status;
43 //mbtk wyq for server_ready_status add end
44
45 mbtk_info_callback_func net_state_cb;
46 mbtk_info_callback_func call_state_cb;
47 mbtk_info_callback_func sms_state_cb;
48 mbtk_info_callback_func radio_state_cb;
49 mbtk_info_callback_func sim_state_cb;
50 mbtk_info_callback_func pdp_state_cb;
51 //add signal by xr
52 mbtk_info_callback_func signal_state_cb;
53} mbtk_info_handle_t;
54
55// PDU include
56enum EnumDCS {
57 BIT7 = 0, // GSM 字符集
58 BIT8 = 1, // ASCII字符集
59 UCS2 = 2 // Unicode 字符集
60};
61
62struct SMS_Struct {
63 char *SCA; // 服务中心地址
64 char *OA; // 发送方地址
65 char *SCTS; // 服务中心时间戳
66 struct UDHS *UDH; // 用户数据头
67 char *UD; // 用户数据
68
69 bool RP; // 应答路径
70 bool UDHI; // 用户数据头标识
71 bool SRI; // 状态报告指示
72 bool MMS; // 更多信息发送
73 int MTI; // 信息类型指示
74
75 char PID; // PID 协议标识
76
77 enum EnumDCS DCS; // 数据编码方案
78 bool TC; // 文本压缩指示 0: 未压缩 1:压缩
79 int MC; // 消息类型 -1: 无 1:移动设备特定类型 2:SIM特定类型 3:终端设备特定类型
80
81};
82
83struct PDUS {
84 unsigned int count;
85 char **PDU;
86};
87
88enum MDAPI_RET_e {
89 MDAPI_RET_SUCCESS = 0,
90 MDAPI_RET_ERROR = 1,
91 MDAPI_RET_TIMEOUT = 2,
92 MDAPI_RET_NOT_SUPPORT = 3,
93};
94
95#define MDAPI_TIME_STR_SIZE 22
96#define MDAPI_PHONE_NUMBER_SIZE 32
97#define MDAPI_MAX_PDU_SIZE 512
98#define MSM_NUMBER_MAX 2048+1
99#define RES_NUM_MIN 128
100#define MIN_MSM_PARAM_NUM 4
101#define MIN_IMS_MSM_PARAM_NUM 6
102#define MIN_WRITMSM_PARAM_NUM 5
103#define MSG_MAX_LEN 1024
104#define TELEPHONNUM_LEN 64
105#define STORAGSMS_MAX_SIZE 128
lichengzhang46a546c2025-06-17 16:24:55 +0800106#define SMSC_MAX_LEN 100
b.liu68a94c92025-05-24 12:53:41 +0800107#define SMS_NUM_MAX 255
108#define MAX_OUT_SIZE 512
109#define MAX_PDU_SIZE 512
110#define MAX_DATE_SIZE 32
111
b.liu68a94c92025-05-24 12:53:41 +0800112GSW_SMS_Callback_fun gsw_sms_callback = NULL;
113
114#define lib_mbtk_path "/lib/libmbtk_lib.so"
115#define lib_qser_sms_path "/lib/liblynq-qser-sms.so"
116
lichengzhang4880ea52025-08-05 14:01:13 +0800117// 短信分片管理器结构体
118typedef struct {
119 char msg_id[64]; // 短信唯一标识(号码+日期)
120 int total_segments; // 总分片数
121 int received_count; // 已接收分片数
122 char** segments; // 分片内容数组
123 time_t last_received; // 最后接收时间
124} SmsReassembler;
125
126#define MAX_SMS_REASSEMBLERS 10 // 最大同时处理的短信数量
127#define MAX_SEGMENTS 255 // 最大分片数
128#define SMS_TIMEOUT 300 // 5分钟超时(秒)
129static SmsReassembler g_sms_reassemblers[MAX_SMS_REASSEMBLERS] = {0};
b.liu68a94c92025-05-24 12:53:41 +0800130
131static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
132int (*mbtk_sms_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
133static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
134struct SMS_Struct (*PDUDecoding)(const char *data);
135char *(*SCADecoding)(const char *data, int *EndIndex);
136char *(*SCAEncoding)(char *SCA);
137struct PDUS *(*PDUEncoding)(char *SCA, char *DA, char *UDC, struct UDHS *udhs);
138int (*mbtk_sms_cmgf_set)(mbtk_info_handle_t* handle, int mode);
139int (*mbtk_sms_cmgs_set)(mbtk_info_handle_t* handle, char * cmgs, char *resp);
140int (*mbtk_sms_csca_set)(mbtk_info_handle_t* handle, char * csca);
141int (*mbtk_sms_csca_get)(mbtk_info_handle_t* handle, char *buf);
142int (*mbtk_sms_cnmi_set)(mbtk_info_handle_t* handle);
lichengzhang7715b2f2025-07-19 10:18:21 +0800143// static void (*mbtk_log)(int level, const char *format, ...);
144// static void (*mbtk_log_init)(char *path, char *tag);
b.liu68a94c92025-05-24 12:53:41 +0800145int (*smsPduEncode)(const char *smsc, const char *da_num, const char *msg, int charset, char *smsc_pdu, char **pdu);
lichengzhangfd152242025-09-02 20:14:24 +0800146int (*smsPduDecode)(const char *pdu_str, int pdu_len, char *da_num, char *smsc, char *msg, int *charset, int *curr_pack, int *total_pack, char *date, int *ref_num);
b.liu68a94c92025-05-24 12:53:41 +0800147kal_int32 (*_mdapi_sms_get_msg_num)(const char *msg, int charset, kal_int32 *msg_num, kal_int32 *msg_len);
148
l.yang6a42e4d2025-05-28 01:04:20 -0700149#define GSW_SMS "[HAL][GSW_SMS]"
b.liu68a94c92025-05-24 12:53:41 +0800150
b.liu68a94c92025-05-24 12:53:41 +0800151static mbtk_info_handle_t* sms_info_handle = NULL;
152static sms_client_handle_type handle;
153static char sms_center_address[SMSC_MAX_LEN] = {0};
154static void *dlHandle_mbtk;
155static int init_flag = 0;
156
157static int mbtk_sms_import()
158{
159 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
160 if (dlHandle_mbtk == NULL)
161 {
xy.heb41615b2025-05-28 16:33:20 +0800162 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800163 }
164
lichengzhang7715b2f2025-07-19 10:18:21 +0800165 // mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
166 // if (mbtk_log_init == NULL)
167 // {
168 // return GSW_HAL_NORMAL_FAIL;
169 // }
b.liu68a94c92025-05-24 12:53:41 +0800170
lichengzhang7715b2f2025-07-19 10:18:21 +0800171 // mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
172 // if (mbtk_log == NULL)
173 // {
174 // return GSW_HAL_NORMAL_FAIL;
175 // }
b.liu68a94c92025-05-24 12:53:41 +0800176
177 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
178 if (mbtk_info_handle_get == NULL)
179 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800180 LOGE(GSW_SMS,"mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800181 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800182 }
183
184 mbtk_sms_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_sms_state_change_cb_reg");
185 if (mbtk_sms_state_change_cb_reg == NULL)
186 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800187 LOGE(GSW_SMS,"mbtk_sms_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800188 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800189 }
190
191 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
192 if (mbtk_info_handle_free == NULL)
193 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800194 LOGE(GSW_SMS,"mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800195 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800196 }
197
198 PDUDecoding = (struct SMS_Struct (*)(const char *data))dlsym(dlHandle_mbtk, "PDUDecoding");
199 if (PDUDecoding == NULL)
200 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800201 LOGE(GSW_SMS,"PDUDecoding dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800202 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800203 }
204
205 SCADecoding = (char *(*)(const char *data, int *EndIndex))dlsym(dlHandle_mbtk, "SCADecoding");
206 if (SCADecoding == NULL)
207 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800208 LOGE(GSW_SMS,"SCADecoding dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800209 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800210 }
211
212 SCAEncoding = (char *(*)(char *SCA))dlsym(dlHandle_mbtk, "SCAEncoding");
213 if (SCAEncoding == NULL)
214 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800215 LOGE(GSW_SMS,"SCAEncoding dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800216 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800217 }
218
219 PDUEncoding = (struct PDUS *(*)(char *SCA, char *DA, char *UDC, struct UDHS *udhs))dlsym(dlHandle_mbtk, "PDUEncoding");
220 if (PDUEncoding == NULL)
221 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800222 LOGE(GSW_SMS,"PDUEncoding dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800223 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800224 }
225
226 mbtk_sms_cmgf_set = (int (*)(mbtk_info_handle_t* handle, int mode))dlsym(dlHandle_mbtk, "mbtk_sms_cmgf_set");
227 if (mbtk_sms_cmgf_set == NULL)
228 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800229 LOGE(GSW_SMS,"mbtk_sms_cmgf_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800230 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800231 }
232
233 mbtk_sms_cmgs_set = (int (*)(mbtk_info_handle_t* handle, char * cmgs, char *resp))dlsym(dlHandle_mbtk, "mbtk_sms_cmgs_set");
234 if (mbtk_sms_cmgs_set == NULL)
235 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800236 LOGE(GSW_SMS,"mbtk_sms_cmgs_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800237 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800238 }
239
240 mbtk_sms_csca_set = (int (*)(mbtk_info_handle_t* handle, char * csca))dlsym(dlHandle_mbtk, "mbtk_sms_csca_set");
241 if (mbtk_sms_csca_set == NULL)
242 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800243 LOGE(GSW_SMS,"mbtk_sms_csca_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800244 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800245 }
246
247 mbtk_sms_csca_get = (int (*)(mbtk_info_handle_t* handle, char *buf))dlsym(dlHandle_mbtk, "mbtk_sms_csca_get");
248 if (mbtk_sms_csca_get == NULL)
249 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800250 LOGE(GSW_SMS,"mbtk_sms_csca_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800251 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800252 }
253
254 mbtk_sms_cnmi_set = (int (*)(mbtk_info_handle_t* handle))dlsym(dlHandle_mbtk, "mbtk_sms_cnmi_set");
255 if (mbtk_sms_cnmi_set == NULL)
256 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800257 LOGE(GSW_SMS,"mbtk_sms_cnmi_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800258 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800259 }
260
261 smsPduEncode = (int (*)(const char *smsc, const char *da_num, const char *msg, int charset, char *smsc_pdu, char **pdu))dlsym(dlHandle_mbtk, "smsPduEncode");
262 if (smsPduEncode == NULL)
263 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800264 LOGE(GSW_SMS,"smsPduEncode dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800265 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800266 }
267
268
lichengzhangfd152242025-09-02 20:14:24 +0800269 smsPduDecode = (int (*)(const char *pdu_str, int pdu_len, char *da_num, char *smsc, char *msg, int *charset, int *curr_pack, int *total_pack, char *date, int *ref_num))dlsym(dlHandle_mbtk,"smsPduDecode");
b.liu68a94c92025-05-24 12:53:41 +0800270 if (smsPduDecode == NULL)
271 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800272 LOGE(GSW_SMS,"smsPduDecode dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800273 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800274 }
275
276 _mdapi_sms_get_msg_num = (kal_int32 (*)(const char *msg, int charset, kal_int32 *msg_num, kal_int32 *msg_len))dlsym(dlHandle_mbtk,"_mdapi_sms_get_msg_num");
277 if (_mdapi_sms_get_msg_num == NULL)
278 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800279 LOGE(GSW_SMS,"_mdapi_sms_get_msg_num dlsym fail");
xy.heb41615b2025-05-28 16:33:20 +0800280 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800281 }
282
283 return GSW_HAL_SUCCESS;
284
285}
286
lichengzhangfd152242025-09-02 20:14:24 +0800287static void generate_sms_id(char* dest, const char* num, int ref_num) {
288 snprintf(dest, 64, "%.30s_%d", num, ref_num);
lichengzhang4880ea52025-08-05 14:01:13 +0800289}
290
291// 查找或创建短信重组器
lichengzhangfd152242025-09-02 20:14:24 +0800292static SmsReassembler* get_sms_reassembler(const char* num, int ref_num, int total_segments)
lichengzhang4880ea52025-08-05 14:01:13 +0800293{
294 char msg_id[64];
lichengzhangfd152242025-09-02 20:14:24 +0800295 generate_sms_id(msg_id, num, ref_num);
296 LOGE(GSW_SMS,"msg_id:%s\n",msg_id);
lichengzhang4880ea52025-08-05 14:01:13 +0800297 time_t current_time = time(NULL);
298
299 for (int i = 0; i < MAX_SMS_REASSEMBLERS; i++)
300 {
301 if (g_sms_reassemblers[i].msg_id[0] != '\0')
302 {
303 // 检查超时
304 if (current_time - g_sms_reassemblers[i].last_received > SMS_TIMEOUT)
305 {
306 // 清理超时重组器
lichengzhang5a25c2a2025-08-20 13:29:54 +0800307 LOGE(GSW_SMS,"start clean reassembler\n");
lichengzhang4880ea52025-08-05 14:01:13 +0800308 for (int j = 0; j < g_sms_reassemblers[i].total_segments; j++)
309 {
310 if (g_sms_reassemblers[i].segments[j])
311 {
312 free(g_sms_reassemblers[i].segments[j]);
313 }
314 }
315 free(g_sms_reassemblers[i].segments);
316 memset(&g_sms_reassemblers[i], 0, sizeof(SmsReassembler));
317 }
318 else if (strcmp(g_sms_reassemblers[i].msg_id, msg_id) == 0)
319 {
lichengzhang5a25c2a2025-08-20 13:29:54 +0800320 LOGE(GSW_SMS,"start clean reassembler2\n");
lichengzhang4880ea52025-08-05 14:01:13 +0800321 g_sms_reassemblers[i].last_received = current_time;
322 return &g_sms_reassemblers[i];
323 }
324 }
325 }
326
327 // 创建新的重组器
328 for (int i = 0; i < MAX_SMS_REASSEMBLERS; i++)
329 {
330 if (g_sms_reassemblers[i].msg_id[0] == '\0')
331 {
332 strncpy(g_sms_reassemblers[i].msg_id, msg_id, sizeof(g_sms_reassemblers[i].msg_id) - 1);
333 g_sms_reassemblers[i].total_segments = total_segments;
334 g_sms_reassemblers[i].received_count = 0;
335 g_sms_reassemblers[i].last_received = current_time;
lichengzhang5a25c2a2025-08-20 13:29:54 +0800336 LOGE(GSW_SMS,"start create reassembler\n");
lichengzhang4880ea52025-08-05 14:01:13 +0800337 // 分配分片数组内存
338 g_sms_reassemblers[i].segments = calloc(total_segments, sizeof(char*));
339 if (!g_sms_reassemblers[i].segments)
340 {
341 LOGE(GSW_SMS, "Memory allocation failed for segments array");
342 memset(&g_sms_reassemblers[i], 0, sizeof(SmsReassembler));
343 return NULL;
344 }
345
346 return &g_sms_reassemblers[i];
347 }
348 }
349
350 LOGE(GSW_SMS, "No free slots for new SMS reassembler");
351 return NULL;
352}
353
354// 重组短信
355static char* reassemble_sms(SmsReassembler* reassembler)
356{
lichengzhangf964e9e2025-08-19 18:59:47 +0800357 LOGE(GSW_SMS, "start real reassemble_sms\n");
lichengzhang4880ea52025-08-05 14:01:13 +0800358 size_t total_len = 0;
359 for (int i = 0; i < reassembler->total_segments; i++)
360 {
361 if (reassembler->segments[i])
362 {
363 total_len += strlen(reassembler->segments[i]);
364 }
365 }
366
367 char* full_msg = malloc(total_len + 1);
368 if (!full_msg)
369 {
370 LOGE(GSW_SMS, "Memory allocation failed for full message");
371 return NULL;
372 }
373
374 full_msg[0] = '\0';
375 for (int i = 0; i < reassembler->total_segments; i++)
376 {
377 if (reassembler->segments[i])
378 {
379 strcat(full_msg, reassembler->segments[i]);
380 }
381 }
382
383 return full_msg;
384}
385
b.liu68a94c92025-05-24 12:53:41 +0800386void ArrayToStr(unsigned char *Buff, unsigned int BuffLen, char *OutputStr)
387{
388 int i = 0;
389 char TempBuff[MSG_MAX_LEN * 2 +1] = {0};
390 char strBuff[MSG_MAX_LEN * 2 +1] = {0};
391
392 for(i = 0; i<BuffLen;i++)
393 {
394 sprintf(TempBuff,"%02x",(unsigned char)Buff[i]);
lichengzhangdab5ee72025-07-21 18:03:00 +0800395 strncat(strBuff,TempBuff,2);
b.liu68a94c92025-05-24 12:53:41 +0800396 }
397 strncpy(OutputStr, strBuff, BuffLen*2);
398 return;
399}
400
lichengzhang4880ea52025-08-05 14:01:13 +0800401void gsw_sms_state_change_cb(const void* data, int data_len)
402{
lichengzhang7715b2f2025-07-19 10:18:21 +0800403 LOGD(GSW_SMS,"gsw_sms_state_change_cb -------start\n");
b.liu68a94c92025-05-24 12:53:41 +0800404
405 uint8 *ptr = (uint8*)data;
406
407 if (!strncmp("+CMT:", (const char *)ptr, 5))//丢弃无用消息
408 return ;
409
410 gsw_sms_msg_type_t gsw_sms_msg;
411 gsw_sms_date_t gsw_sms_date;
412
413 memset(&gsw_sms_msg, 0, sizeof(gsw_sms_msg_type_t));
414 memset(&gsw_sms_date, 0, sizeof(gsw_sms_date_t));
415
416 char smsc[MDAPI_MAX_PDU_SIZE] = {0};
417 char received_pdu[MDAPI_MAX_PDU_SIZE] = {0};
418 char msg[MDAPI_MAX_PDU_SIZE] = {0};
419 char num[MDAPI_MAX_PDU_SIZE] = {0};
420 char date[MAX_DATE_SIZE] = {0};
421 int charset = 0;
422 int ret = -1;
423 int curr_pack = 1;
424 int total_pack = 1;
lichengzhangfd152242025-09-02 20:14:24 +0800425 int ref_num = 0;
b.liu68a94c92025-05-24 12:53:41 +0800426 if(ptr == NULL)
427 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800428 LOGE(GSW_SMS,"ptr is null");
b.liu68a94c92025-05-24 12:53:41 +0800429 }
lichengzhang7715b2f2025-07-19 10:18:21 +0800430 LOGE(GSW_SMS,"ptr: %s\n,data_len = %d\n", (char *)ptr, data_len);
b.liu68a94c92025-05-24 12:53:41 +0800431 if(data_len > MDAPI_MAX_PDU_SIZE)
432 {
433 strncpy(received_pdu, (const char *)ptr, MDAPI_MAX_PDU_SIZE-1);
434 }
435 else
436 {
437 strncpy(received_pdu, (const char *)ptr, data_len);
438 }
lichengzhangfd152242025-09-02 20:14:24 +0800439 ret = smsPduDecode((const char *)received_pdu, data_len, num, smsc, msg, &charset, &curr_pack, &total_pack, date,&ref_num);
b.liu68a94c92025-05-24 12:53:41 +0800440 if(ret != 0)
441 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800442 LOGE(GSW_SMS,"smsPduDecode fail\n");
b.liu68a94c92025-05-24 12:53:41 +0800443 return ;
444 }
lichengzhang7715b2f2025-07-19 10:18:21 +0800445 LOGE(GSW_SMS,"smsPduDecode ret: %d\n", ret);
446 LOGE(GSW_SMS,"SMS :%s, %s, %d\n", __FILE__, __FUNCTION__, __LINE__);
447 LOGE(GSW_SMS,"[EVENT][MT_SMS]PDU decode:smsc: %s\n, phone number: %s\ncharset: %d\n msg_len: %d\n message content: %s\n curr_pack: %d\n total_pack: %d\n date: %s", smsc, num, charset, strlen(msg), msg, curr_pack, total_pack, date);
b.liu68a94c92025-05-24 12:53:41 +0800448
449 gsw_sms_msg.content_encode = charset;
450 memcpy(gsw_sms_msg.src_num, num, strlen(num));
451 gsw_sms_msg.content_len = strlen(msg);
452 memcpy(gsw_sms_msg.content, msg, strlen(msg));
453
454 if(sscanf(date, "%4[^-]-%2[^-]-%2[^ ] %2[^:]:%2[^:]:%2s", (char*)gsw_sms_date.year, (char*)gsw_sms_date.month, (char*)gsw_sms_date.day, (char*)gsw_sms_date.hour, (char*)gsw_sms_date.minutes, (char*)gsw_sms_date.seconds)<=0)
455 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800456 LOGE(GSW_SMS,"sscanf failed\n");
b.liu68a94c92025-05-24 12:53:41 +0800457 }
458
459 snprintf((char *)gsw_sms_date.timezone, sizeof(gsw_sms_date.timezone), "%s","+8");
460
lichengzhang7715b2f2025-07-19 10:18:21 +0800461 LOGE(GSW_SMS,"Year: %s\n", (char*)gsw_sms_date.year);
462 LOGE(GSW_SMS,"Month: %s\n", (char*)gsw_sms_date.month);
463 LOGE(GSW_SMS,"Day: %s\n", (char*)gsw_sms_date.day);
464 LOGE(GSW_SMS,"Hour: %s\n", (char*)gsw_sms_date.hour);
465 LOGE(GSW_SMS,"Minute: %s\n", (char*)gsw_sms_date.minutes);
466 LOGE(GSW_SMS,"Second: %s\n", (char*)gsw_sms_date.seconds);
b.liu68a94c92025-05-24 12:53:41 +0800467
468 gsw_sms_msg.date = gsw_sms_date;
lichengzhang4880ea52025-08-05 14:01:13 +0800469
b.liu68a94c92025-05-24 12:53:41 +0800470
471 if(gsw_sms_callback)
472 {
lichengzhang4880ea52025-08-05 14:01:13 +0800473 if(total_pack > 1)
474 {
lichengzhangfd152242025-09-02 20:14:24 +0800475 SmsReassembler* reassembler = get_sms_reassembler(num, ref_num, total_pack);
lichengzhang4880ea52025-08-05 14:01:13 +0800476 if (!reassembler)
477 {
478 LOGE(GSW_SMS, "Failed to get SMS reassembler");
479 return;
480 }
481 int seg_index = curr_pack - 1;
482
483 // 如果该分片尚未接收
484 if (!reassembler->segments[seg_index])
485 {
486 reassembler->segments[seg_index] = strdup(msg);
487 if (!reassembler->segments[seg_index])
488 {
489 LOGE(GSW_SMS, "Memory allocation failed for segment content");
490 return;
491 }
492 reassembler->received_count++;
lichengzhangfd152242025-09-02 20:14:24 +0800493 LOGE(GSW_SMS, "seg_index:%d\n",reassembler->received_count);
lichengzhang4880ea52025-08-05 14:01:13 +0800494 }
lichengzhangfd152242025-09-02 20:14:24 +0800495 LOGE(GSW_SMS, "seg_index:%d\n",seg_index);
lichengzhang4880ea52025-08-05 14:01:13 +0800496 // 检查是否所有分片都已接收
497 if (reassembler->received_count == reassembler->total_segments)
498 {
499 char* full_msg = reassemble_sms(reassembler);
500 if (full_msg)
501 {
lichengzhangfd152242025-09-02 20:14:24 +0800502 LOGE(GSW_SMS, "total_segments:%d\n",reassembler->received_count);
lichengzhang4880ea52025-08-05 14:01:13 +0800503 gsw_sms_msg.content_encode = charset;
504 strncpy(gsw_sms_msg.src_num, num, sizeof(gsw_sms_msg.src_num) - 1);
505 gsw_sms_msg.content_len = strlen(full_msg);
506
507 size_t copy_size = (gsw_sms_msg.content_len < sizeof(gsw_sms_msg.content)) ?
508 gsw_sms_msg.content_len : sizeof(gsw_sms_msg.content) - 1;
509 strncpy(gsw_sms_msg.content, full_msg, copy_size);
510 gsw_sms_msg.content[copy_size] = '\0';
lichengzhangfd152242025-09-02 20:14:24 +0800511 LOGE(GSW_SMS, "gsw_sms_msg:%s\n",gsw_sms_msg.content);
lichengzhang4880ea52025-08-05 14:01:13 +0800512 snprintf((char *)gsw_sms_date.timezone, sizeof(gsw_sms_date.timezone), "%s", "+8");
513
514 if (gsw_sms_callback)
lichengzhangf964e9e2025-08-19 18:59:47 +0800515 gsw_sms_callback(GSW_SMS_RECEIVED_FLG, &gsw_sms_msg);
lichengzhang4880ea52025-08-05 14:01:13 +0800516
517 free(full_msg);
518 }
519
520 for (int i = 0; i < reassembler->total_segments; i++)
521 {
522 if (reassembler->segments[i])
523 {
524 free(reassembler->segments[i]);
525 reassembler->segments[i] = NULL;
526 }
527 }
528 free(reassembler->segments);
529 reassembler->segments = NULL;
530 reassembler->received_count = 0;
531 reassembler->total_segments = 0;
532 memset(reassembler->msg_id, 0, sizeof(reassembler->msg_id));
533 }
534 }
535 else
lichengzhangf964e9e2025-08-19 18:59:47 +0800536 gsw_sms_callback(GSW_SMS_RECEIVED_FLG, &gsw_sms_msg);
b.liu68a94c92025-05-24 12:53:41 +0800537 }
b.liu68a94c92025-05-24 12:53:41 +0800538}
539
540
541/**
542 * @brief SDK interface to call back sms messages
543 * @param [in] handle_ptr
544 * @retval 0: success
545 * @retval other: fail
546 */
547int gsw_sms_reg_callback(GSW_SMS_Callback_fun handle_ptr)
548{
549 if(init_flag == 0)
550 {
551 return -1;
552 }
553
554 if(handle_ptr == NULL)
555 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800556 LOGE(GSW_SMS,"gsw_sms_reg_callback fail,handle_ptr is null\n");
b.liu68a94c92025-05-24 12:53:41 +0800557 return -1;
558 }
559 else
560 {
561 gsw_sms_callback = handle_ptr;
562 }
563 return GSW_HAL_SUCCESS;
564}
565
566/**
567 * @brief sms sdk init
568 * @param [in] token
569 * @retval 0: success
570 * @retval other: fail
571 */
hong.liud2417072025-06-27 07:10:37 -0700572int gsw_sms_sdk_init(int32_t token)
b.liu68a94c92025-05-24 12:53:41 +0800573{
574 handle = token;
575 int ret = -1;
576
577 if(init_flag == 1)
578 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800579 LOGE(GSW_SMS,"has init sms sdk,return\n");
b.liu68a94c92025-05-24 12:53:41 +0800580 return GSW_HAL_SUCCESS;
581 }
582
583 ret = mbtk_sms_import();
584 if(ret != 0)
585 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800586 // if(mbtk_log != NULL)
587 // {
588 // LOGE(GSW_SMS,"[gsw_sms_sdk_init]mbtk_sms_import fail\n");
589 // }
xy.heb41615b2025-05-28 16:33:20 +0800590 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800591 }
592
lichengzhang77046872025-07-07 11:45:51 +0800593 //mbtk_log_init("syslog", "MBTK_RIL");
b.liu68a94c92025-05-24 12:53:41 +0800594
595 sms_info_handle = mbtk_info_handle_get();
596 if(sms_info_handle == NULL)
597 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800598 LOGE(GSW_SMS,"[gsw_sms_sdk_init] mbtk handle init fail\n");
b.liu68a94c92025-05-24 12:53:41 +0800599 dlclose(dlHandle_mbtk);
xy.heb41615b2025-05-28 16:33:20 +0800600 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800601 }
602
603 ret = mbtk_sms_cnmi_set(sms_info_handle);
604 if(ret != 0)
605 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800606 LOGE(GSW_SMS,"mbtk_sms_cnmi_set fail.[%d]\n", ret);
xy.heb41615b2025-05-28 16:33:20 +0800607 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800608 }
609
610 ret = mbtk_sms_state_change_cb_reg(sms_info_handle, gsw_sms_state_change_cb);
611 if(ret != 0)
612 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800613 LOGE(GSW_SMS,"mbtk_sms_state_change_cb_reg fail.[%d]\n", ret);
b.liu68a94c92025-05-24 12:53:41 +0800614 if(sms_info_handle)
615 {
616 mbtk_info_handle_free(&sms_info_handle);
617 sms_info_handle = NULL;
618 }
xy.heb41615b2025-05-28 16:33:20 +0800619 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800620 }
621
lichengzhang7715b2f2025-07-19 10:18:21 +0800622 LOGD(GSW_SMS,"[gsw_sms_sdk_init]gsw_sms_sdk_init success\n");
b.liu68a94c92025-05-24 12:53:41 +0800623 init_flag = 1;
624 return GSW_HAL_SUCCESS;
625}
626
627/**
628 * @brief sms sdk deinit
629 * @param
630 * @retval 0: success
631 * @retval other: fail
632 */
633int gsw_sms_sdk_deinit(void)
634{
635 int ret = -1;
636
637 if(init_flag == 0)
638 {
639 return -1;
640 }
641
lichengzhang7715b2f2025-07-19 10:18:21 +0800642 LOGD(GSW_SMS,"callback clear\n");
b.liu68a94c92025-05-24 12:53:41 +0800643 gsw_sms_callback = NULL;
644
lichengzhang7715b2f2025-07-19 10:18:21 +0800645 LOGD(GSW_SMS,"handle_free\n");
b.liu68a94c92025-05-24 12:53:41 +0800646 if(sms_info_handle != NULL)
647 {
648 ret = mbtk_info_handle_free(&sms_info_handle);
649 if(ret != 0)
650 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800651 LOGE(GSW_SMS,"[gsw_sms_sdk_deinit]mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800652 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800653 }
654 sms_info_handle = NULL;
655 }
656
lichengzhang7715b2f2025-07-19 10:18:21 +0800657 LOGD(GSW_SMS,"dlclose start\n");
b.liu68a94c92025-05-24 12:53:41 +0800658 if(dlHandle_mbtk == NULL)
659 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800660 LOGE(GSW_SMS,"[gsw_sms_sdk_deinit]dlHandle_sms is null\n");
b.liu68a94c92025-05-24 12:53:41 +0800661 }
662 else
663 {
664 dlclose(dlHandle_mbtk);
665 }
lichengzhang7715b2f2025-07-19 10:18:21 +0800666 LOGD(GSW_SMS,"dlclose end\n");
b.liu68a94c92025-05-24 12:53:41 +0800667 init_flag = 0;
668 return GSW_HAL_SUCCESS;
669}
670
671/**
672 * @brief send sms fuction *
673 * @param [in] phone_num dest phone num send sms
674 * @param [in] char_set encode format for sms 0 7bit 1 binary 2 usc2
675 * @param [in] msg sms content
676 * @param [in] msg_len send sms length,max is 1024
677 * @retval 0: success
678 * @retval other: fail
679 */
680int gsw_send_sms(char *phone_num, int char_set, char *msg, int msg_len)
681{
682
683 if(init_flag == 0)
684 {
xy.heb41615b2025-05-28 16:33:20 +0800685 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800686 }
687
688 if(phone_num == NULL || msg == NULL)
689 {
xy.heb41615b2025-05-28 16:33:20 +0800690 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800691 }
692
lichengzhangdab5ee72025-07-21 18:03:00 +0800693 if(strlen((char *)msg) == 0 || strlen((char *)phone_num) == 0)
b.liu68a94c92025-05-24 12:53:41 +0800694 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800695 LOGE(GSW_SMS,"strlen(telephony_num):%d", strlen((char *)phone_num));
696 LOGE(GSW_SMS,"strlen(msg):%d", strlen((char *)msg));
xy.heb41615b2025-05-28 16:33:20 +0800697 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800698 }
lichengzhangdab5ee72025-07-21 18:03:00 +0800699 if(strlen((char *)msg) > MSG_MAX_LEN || msg_len > MSG_MAX_LEN || strlen((char *)msg) != msg_len)
700 {
701 LOGE(GSW_SMS,"stelen is %d\n",strlen((char *)msg));
702 LOGE(GSW_SMS,"the lenth is error\n");
703 return GSW_HAL_NORMAL_FAIL;
704 }
b.liu68a94c92025-05-24 12:53:41 +0800705
706 int err = -1;
707
708 char smscPDU[30] = {0};
709 char **pdu = NULL;
710 char smsc[4] = {0};
711 char cmgs[MSM_NUMBER_MAX] = {0};
712 char resp[RES_NUM_MIN] = {0};
713 char msg_e_b[GSW_SMS_RECV_CONT_MAX+1] = {0};// +1 for end of string.*2:A char array contains two elements of a string for each value
714
715 kal_int32 msg_num = 0;
716 kal_int32 pdu_msg_len = 0;
717 kal_int32 status = MDAPI_RET_ERROR;
718 kal_int32 index = 0;
719
720 if(char_set == 1) //8bit
721 {
722 ArrayToStr((unsigned char *)msg, (unsigned int)msg_len, msg_e_b);
723 status = _mdapi_sms_get_msg_num(msg_e_b, char_set, &msg_num, &pdu_msg_len);
724 }
725
726 else //7bit usc2
727 {
728 status = _mdapi_sms_get_msg_num((char *)msg, char_set, &msg_num, &pdu_msg_len);
729 }
730
lichengzhang7715b2f2025-07-19 10:18:21 +0800731 LOGE(GSW_SMS,"%s, %s, %d, msg_len = [%d] ,msg_num=[%d]\n", __FILE__, __FUNCTION__, __LINE__, msg_len, msg_num);
b.liu68a94c92025-05-24 12:53:41 +0800732 if(status == MDAPI_RET_ERROR)
733 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800734 LOGE(GSW_SMS,"get message number failed\n");
xy.heb41615b2025-05-28 16:33:20 +0800735 //return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800736 }
737 else
738 {
739 //allocate memery for **pdu
740 pdu = (char **)malloc(sizeof(char *) * msg_num);
741 if(pdu == NULL)
742 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800743 LOGE(GSW_SMS,"%s, %s, %d, allocate memory for pdu failed\n", __FILE__, __FUNCTION__, __LINE__);
xy.heb41615b2025-05-28 16:33:20 +0800744 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800745 }
746
747 else
748 {
749 for(index = 0; index < msg_num; index++)
750 {
751 pdu[index] = (char *)malloc(sizeof(char)*MAX_PDU_SIZE);
752 if(pdu[index] == NULL)
753 {
754 for(int i = 0; i < index; i++)
755 {
756 free(pdu[i]);
757 pdu[i] = NULL;
758 }
759 free(pdu);
760 pdu = NULL;
lichengzhang7715b2f2025-07-19 10:18:21 +0800761 LOGE(GSW_SMS,"%s, %s, %d, allocate memory for pdu[%d] failed\n", __FILE__, __FUNCTION__, __LINE__,index);
xy.heb41615b2025-05-28 16:33:20 +0800762 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800763 }
764 else
765 {
766 memset(pdu[index], 0, MAX_PDU_SIZE);
lichengzhang7715b2f2025-07-19 10:18:21 +0800767 LOGE(GSW_SMS,"%s, %s, %d, pdu[%d} init value is: %s \n", __FILE__, __FUNCTION__, __LINE__, index, pdu[index]);
b.liu68a94c92025-05-24 12:53:41 +0800768 }
769 }
770 }
771 }
772
773 //allocate memory for **pdu success
774 if(index == msg_num)
775 {
776 if(char_set == 1)//8bit
777 {
778 smsPduEncode(smsc, (char *)phone_num, msg_e_b, char_set, smscPDU, pdu);
779 }
780 else
781 {
782 smsPduEncode(smsc, (char *)phone_num, (char *)msg, char_set, smscPDU, pdu);
783 }
784 for(index = 0; index < msg_num; index++)
785 {
786 char pdu_data[MAX_PDU_SIZE] = {0};
787 char *p = pdu_data;
788
lichengzhang7715b2f2025-07-19 10:18:21 +0800789 LOGE(GSW_SMS,"index:%d\n",index);
790 LOGE(GSW_SMS,"%s, %s, %d, smscPDU: %s, pdu: %s",__FILE__, __FUNCTION__, __LINE__, smscPDU, pdu[index]);
b.liu68a94c92025-05-24 12:53:41 +0800791 sprintf(p, "%s",smscPDU);
lichengzhang7715b2f2025-07-19 10:18:21 +0800792 LOGE(GSW_SMS,"pdu_data:%s\n", pdu_data);
b.liu68a94c92025-05-24 12:53:41 +0800793 int sc = strlen(pdu_data);
794 sprintf(p+strlen(p), "%s", pdu[index]);
lichengzhang7715b2f2025-07-19 10:18:21 +0800795 LOGE(GSW_SMS,"pdu_data:%s\n", pdu_data);
b.liu68a94c92025-05-24 12:53:41 +0800796
797 int t = strlen(pdu_data);
798 sprintf(cmgs, "%d,%s", (t-sc)/2, pdu_data);
lichengzhang7715b2f2025-07-19 10:18:21 +0800799 LOGE(GSW_SMS,"cmgs:%s\n", cmgs);
b.liu68a94c92025-05-24 12:53:41 +0800800 memset(resp, 0, sizeof(resp));
801
802 err = mbtk_sms_cmgf_set(sms_info_handle, 0);
803 if(err)
804 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800805 LOGE(GSW_SMS,"cmgf set error : %d\n", err);
b.liu68a94c92025-05-24 12:53:41 +0800806 for(index = 0; index < msg_num; index++){
807 free(pdu[index]);
808 pdu[index] = NULL;
809 }
810 free(pdu);
811 pdu = NULL;
xy.heb41615b2025-05-28 16:33:20 +0800812 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800813 }
814 else
815 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800816 LOGD(GSW_SMS,"cmgf set success\n");
b.liu68a94c92025-05-24 12:53:41 +0800817 }
818
819 err = mbtk_sms_cmgs_set(sms_info_handle, cmgs, resp);
820 if(err)
821 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800822 LOGE(GSW_SMS,"cmgs send fail\n");
b.liu68a94c92025-05-24 12:53:41 +0800823 for(index = 0; index < msg_num; index++){
824 free(pdu[index]);
825 pdu[index] = NULL;
826 }
827 free(pdu);
828 pdu = NULL;
xy.heb41615b2025-05-28 16:33:20 +0800829 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800830 }
831 else
832 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800833 LOGD(GSW_SMS,"cmgs send success, resp:%s\n", resp);
b.liu68a94c92025-05-24 12:53:41 +0800834 }
835
836 }
837 }
838
839 for(index = 0; index < msg_num; index++){
840 free(pdu[index]);
841 pdu[index] = NULL;
842 }
843 free(pdu);
844 pdu = NULL;
845
846 return GSW_HAL_SUCCESS;
847}
848
849
850/**
851 * @brief get smsc fuction *
852 * @param [in] len input buf len for smsc,max is 32
853 * @param [out] smsc address for smsc get from this func *
854 * @retval 0: success
855 * @retval other: fail
856 */
857int gsw_get_smsc_address(int len, char *smsc)
858{
859 int ret = -1;
860 int len_t = 0;
861 char smsc_temp[SMSC_MAX_LEN] = {0};
862 char *p1, *p2 ,*substr;
863
864 if(init_flag == 0)
865 {
xy.heb41615b2025-05-28 16:33:20 +0800866 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800867 }
868
869 if(smsc == NULL || len <= 0)
870 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800871 LOGE(GSW_SMS,"smsc is null or len = %d\n",len);
xy.heb41615b2025-05-28 16:33:20 +0800872 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800873 }
874
875 ret = mbtk_sms_csca_get(sms_info_handle, smsc_temp);
876 if(smsc_temp[0] == '\0')
877 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800878 LOGE(GSW_SMS,"gsw_get_smsc_address Error : %d\n", ret);
xy.heb41615b2025-05-28 16:33:20 +0800879 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800880 }
881
882 else
883 {
884 p1 = strchr(smsc_temp, '\"');
885 p2 = strrchr(smsc_temp, '\"');
886 if (p1 && p2 && p2 > p1)
887 {
888 len_t = p2 - p1 - 1;
hong.liud2417072025-06-27 07:10:37 -0700889 substr = malloc(len_t + 1);
890 if (NULL == substr)
b.liu68a94c92025-05-24 12:53:41 +0800891 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800892 LOGE(GSW_SMS,"substr = NULL, malloc faill!!!\n");
hong.liud2417072025-06-27 07:10:37 -0700893 return GSW_HAL_NO_MEMORY;
b.liu68a94c92025-05-24 12:53:41 +0800894 }
hong.liud2417072025-06-27 07:10:37 -0700895 strncpy(substr, p1 + 1, len_t);
896 substr[len_t] = '\0';
lichengzhang12647e52025-07-21 17:23:10 +0800897 strncpy(smsc, substr, len);
898 strncpy(sms_center_address, substr, len);
b.liu68a94c92025-05-24 12:53:41 +0800899
lichengzhang7715b2f2025-07-19 10:18:21 +0800900 LOGE(GSW_SMS,"qser_sms_getsmscenteraddress success, smsc = %s\n", sms_center_address);
hong.liud2417072025-06-27 07:10:37 -0700901 free(substr);
902 substr = NULL;
b.liu68a94c92025-05-24 12:53:41 +0800903 }
904 else
905 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800906 LOGE(GSW_SMS,"String inside double quotes not found\n");
xy.heb41615b2025-05-28 16:33:20 +0800907 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800908 }
909 }
910
911
912 return GSW_HAL_SUCCESS;
913}
914
915/**
916 * @brief set smsc fuction
917 * @param [out] smsc string value for smsc,max length is 32 *
918 * @retval 0: success
919 * @retval other: fail
920 */
921int gsw_set_smsc_address(const char *smsc)
922{
923 int ret = -1;
924
925 if(init_flag == 0)
926 {
xy.heb41615b2025-05-28 16:33:20 +0800927 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800928 }
929
930 if(smsc == NULL || strlen((char *)smsc) == 0)
931 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800932 LOGE(GSW_SMS,"smsc is null or empty\n");
xy.heb41615b2025-05-28 16:33:20 +0800933 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800934 }
935
936 ret = mbtk_sms_csca_set(sms_info_handle, (char *)smsc);
937
938 if(ret == 0)
939 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800940 LOGE(GSW_SMS,"set smsc success,smsc = %s\n",smsc);
b.liu68a94c92025-05-24 12:53:41 +0800941 }
942 else
943 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800944 LOGE(GSW_SMS,"set smsc fail,ret = %d\n", ret);
xy.heb41615b2025-05-28 16:33:20 +0800945 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800946 }
947
948 return GSW_HAL_SUCCESS;
949}