blob: 415bc490add02a89027e4d5c586b342ea3404103 [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"
b.liu68a94c92025-05-24 12:53:41 +08008
9typedef 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
b.liu68a94c92025-05-24 12:53:41 +0800117
118static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
119int (*mbtk_sms_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
120static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
121struct SMS_Struct (*PDUDecoding)(const char *data);
122char *(*SCADecoding)(const char *data, int *EndIndex);
123char *(*SCAEncoding)(char *SCA);
124struct PDUS *(*PDUEncoding)(char *SCA, char *DA, char *UDC, struct UDHS *udhs);
125int (*mbtk_sms_cmgf_set)(mbtk_info_handle_t* handle, int mode);
126int (*mbtk_sms_cmgs_set)(mbtk_info_handle_t* handle, char * cmgs, char *resp);
127int (*mbtk_sms_csca_set)(mbtk_info_handle_t* handle, char * csca);
128int (*mbtk_sms_csca_get)(mbtk_info_handle_t* handle, char *buf);
129int (*mbtk_sms_cnmi_set)(mbtk_info_handle_t* handle);
130static void (*mbtk_log)(int level, const char *format, ...);
131static void (*mbtk_log_init)(char *path, char *tag);
132int (*smsPduEncode)(const char *smsc, const char *da_num, const char *msg, int charset, char *smsc_pdu, char **pdu);
133int (*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);
134kal_int32 (*_mdapi_sms_get_msg_num)(const char *msg, int charset, kal_int32 *msg_num, kal_int32 *msg_len);
135
136#ifndef LOG_ERR_LEVEL
137#define LOG_ERR_LEVEL 3 /* error conditions */
138#endif
139#ifndef LOG_WARN_LEVEL
140#define LOG_WARN_LEVEL 4 /* warning conditions */
141#endif
142#ifndef LOG_INFO_LEVEL
143#define LOG_INFO_LEVEL 6 /* informational */
144#endif
145#ifndef LOG_DEBUG_LEVEL
146#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
147#endif
148#ifndef LOG_VERBOSE_LEVEL
149#define LOG_VERBOSE_LEVEL 8
150#endif
l.yang6a42e4d2025-05-28 01:04:20 -0700151#define GSW_SMS "[HAL][GSW_SMS]"
b.liu68a94c92025-05-24 12:53:41 +0800152
153#define LOGV(fmt, args ...) \
154 do{ \
155 char *file_ptr_1001 = __FILE__; \
156 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
157 char line_1001[10] = {0}; \
158 sprintf(line_1001, "%d", __LINE__); \
159 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
160 if(*ptr_1001 == '/') \
161 break; \
162 ptr_1001--; \
163 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700164 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_SMS"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800165 } while(0)
166
167#define LOGI(fmt, args...) \
168 do{ \
169 char *file_ptr_1001 = __FILE__; \
170 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
171 char line_1001[10] = {0}; \
172 sprintf(line_1001, "%d", __LINE__); \
173 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
174 if(*ptr_1001 == '/') \
175 break; \
176 ptr_1001--; \
177 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700178 mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_SMS"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800179 } while(0)
180
181#define LOGD(fmt, args...) \
182 do{ \
183 char *file_ptr_1001 = __FILE__; \
184 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
185 char line_1001[10] = {0}; \
186 sprintf(line_1001, "%d", __LINE__); \
187 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
188 if(*ptr_1001 == '/') \
189 break; \
190 ptr_1001--; \
191 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700192 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_SMS"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800193 } while(0)
194
195#define LOGW(fmt, args...) \
196 do{ \
197 char *file_ptr_1001 = __FILE__; \
198 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
199 char line_1001[10] = {0}; \
200 sprintf(line_1001, "%d", __LINE__); \
201 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
202 if(*ptr_1001 == '/') \
203 break; \
204 ptr_1001--; \
205 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700206 mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_SMS"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800207 } while(0)
208
209#define LOGE(fmt, args...) \
210 do{ \
211 char *file_ptr_1001 = __FILE__; \
212 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
213 char line_1001[10] = {0}; \
214 sprintf(line_1001, "%d", __LINE__); \
215 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
216 if(*ptr_1001 == '/') \
217 break; \
218 ptr_1001--; \
219 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700220 mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_SMS"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800221 } while(0)
222
223
224
225static mbtk_info_handle_t* sms_info_handle = NULL;
226static sms_client_handle_type handle;
227static char sms_center_address[SMSC_MAX_LEN] = {0};
228static void *dlHandle_mbtk;
229static int init_flag = 0;
230
231static int mbtk_sms_import()
232{
233 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
234 if (dlHandle_mbtk == NULL)
235 {
xy.heb41615b2025-05-28 16:33:20 +0800236 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800237 }
238
239 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
240 if (mbtk_log_init == NULL)
241 {
xy.heb41615b2025-05-28 16:33:20 +0800242 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800243 }
244
245 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
246 if (mbtk_log == NULL)
247 {
xy.heb41615b2025-05-28 16:33:20 +0800248 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800249 }
250
251 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
252 if (mbtk_info_handle_get == NULL)
253 {
254 LOGE("mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800255 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800256 }
257
258 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");
259 if (mbtk_sms_state_change_cb_reg == NULL)
260 {
261 LOGE("mbtk_sms_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800262 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800263 }
264
265 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
266 if (mbtk_info_handle_free == NULL)
267 {
268 LOGE("mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800269 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800270 }
271
272 PDUDecoding = (struct SMS_Struct (*)(const char *data))dlsym(dlHandle_mbtk, "PDUDecoding");
273 if (PDUDecoding == NULL)
274 {
275 LOGE("PDUDecoding dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800276 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800277 }
278
279 SCADecoding = (char *(*)(const char *data, int *EndIndex))dlsym(dlHandle_mbtk, "SCADecoding");
280 if (SCADecoding == NULL)
281 {
282 LOGE("SCADecoding dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800283 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800284 }
285
286 SCAEncoding = (char *(*)(char *SCA))dlsym(dlHandle_mbtk, "SCAEncoding");
287 if (SCAEncoding == NULL)
288 {
289 LOGE("SCAEncoding dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800290 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800291 }
292
293 PDUEncoding = (struct PDUS *(*)(char *SCA, char *DA, char *UDC, struct UDHS *udhs))dlsym(dlHandle_mbtk, "PDUEncoding");
294 if (PDUEncoding == NULL)
295 {
296 LOGE("PDUEncoding dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800297 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800298 }
299
300 mbtk_sms_cmgf_set = (int (*)(mbtk_info_handle_t* handle, int mode))dlsym(dlHandle_mbtk, "mbtk_sms_cmgf_set");
301 if (mbtk_sms_cmgf_set == NULL)
302 {
303 LOGE("mbtk_sms_cmgf_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800304 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800305 }
306
307 mbtk_sms_cmgs_set = (int (*)(mbtk_info_handle_t* handle, char * cmgs, char *resp))dlsym(dlHandle_mbtk, "mbtk_sms_cmgs_set");
308 if (mbtk_sms_cmgs_set == NULL)
309 {
310 LOGE("mbtk_sms_cmgs_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800311 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800312 }
313
314 mbtk_sms_csca_set = (int (*)(mbtk_info_handle_t* handle, char * csca))dlsym(dlHandle_mbtk, "mbtk_sms_csca_set");
315 if (mbtk_sms_csca_set == NULL)
316 {
317 LOGE("mbtk_sms_csca_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800318 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800319 }
320
321 mbtk_sms_csca_get = (int (*)(mbtk_info_handle_t* handle, char *buf))dlsym(dlHandle_mbtk, "mbtk_sms_csca_get");
322 if (mbtk_sms_csca_get == NULL)
323 {
324 LOGE("mbtk_sms_csca_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800325 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800326 }
327
328 mbtk_sms_cnmi_set = (int (*)(mbtk_info_handle_t* handle))dlsym(dlHandle_mbtk, "mbtk_sms_cnmi_set");
329 if (mbtk_sms_cnmi_set == NULL)
330 {
331 LOGE("mbtk_sms_cnmi_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800332 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800333 }
334
335 smsPduEncode = (int (*)(const char *smsc, const char *da_num, const char *msg, int charset, char *smsc_pdu, char **pdu))dlsym(dlHandle_mbtk, "smsPduEncode");
336 if (smsPduEncode == NULL)
337 {
338 LOGE("smsPduEncode dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800339 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800340 }
341
342
343 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))dlsym(dlHandle_mbtk,"smsPduDecode");
344 if (smsPduDecode == NULL)
345 {
346 LOGE("smsPduDecode dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800347 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800348 }
349
350 _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");
351 if (_mdapi_sms_get_msg_num == NULL)
352 {
353 LOGE("_mdapi_sms_get_msg_num dlsym fail");
xy.heb41615b2025-05-28 16:33:20 +0800354 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800355 }
356
357 return GSW_HAL_SUCCESS;
358
359}
360
361void ArrayToStr(unsigned char *Buff, unsigned int BuffLen, char *OutputStr)
362{
363 int i = 0;
364 char TempBuff[MSG_MAX_LEN * 2 +1] = {0};
365 char strBuff[MSG_MAX_LEN * 2 +1] = {0};
366
367 for(i = 0; i<BuffLen;i++)
368 {
369 sprintf(TempBuff,"%02x",(unsigned char)Buff[i]);
370 strncat(strBuff,TempBuff,BuffLen*2);
371 }
372 strncpy(OutputStr, strBuff, BuffLen*2);
373 return;
374}
375
376void gsw_sms_state_change_cb(const void* data, int data_len) {
377 LOGD("gsw_sms_state_change_cb -------start\n");
378
379 uint8 *ptr = (uint8*)data;
380
381 if (!strncmp("+CMT:", (const char *)ptr, 5))//丢弃无用消息
382 return ;
383
384 gsw_sms_msg_type_t gsw_sms_msg;
385 gsw_sms_date_t gsw_sms_date;
386
387 memset(&gsw_sms_msg, 0, sizeof(gsw_sms_msg_type_t));
388 memset(&gsw_sms_date, 0, sizeof(gsw_sms_date_t));
389
390 char smsc[MDAPI_MAX_PDU_SIZE] = {0};
391 char received_pdu[MDAPI_MAX_PDU_SIZE] = {0};
392 char msg[MDAPI_MAX_PDU_SIZE] = {0};
393 char num[MDAPI_MAX_PDU_SIZE] = {0};
394 char date[MAX_DATE_SIZE] = {0};
395 int charset = 0;
396 int ret = -1;
397 int curr_pack = 1;
398 int total_pack = 1;
399 if(ptr == NULL)
400 {
401 LOGE("ptr is null");
402 }
403 LOGE("ptr: %s\n,data_len = %d\n", (char *)ptr, data_len);
404 if(data_len > MDAPI_MAX_PDU_SIZE)
405 {
406 strncpy(received_pdu, (const char *)ptr, MDAPI_MAX_PDU_SIZE-1);
407 }
408 else
409 {
410 strncpy(received_pdu, (const char *)ptr, data_len);
411 }
412 ret = smsPduDecode((const char *)received_pdu, data_len, num, smsc, msg, &charset, &curr_pack, &total_pack,date);
413 if(ret != 0)
414 {
415 LOGE("smsPduDecode fail\n");
416 return ;
417 }
418 LOGE("smsPduDecode ret: %d\n", ret);
419 LOGE("SMS :%s, %s, %d\n", __FILE__, __FUNCTION__, __LINE__);
420 LOGE("[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);
421
422 gsw_sms_msg.content_encode = charset;
423 memcpy(gsw_sms_msg.src_num, num, strlen(num));
424 gsw_sms_msg.content_len = strlen(msg);
425 memcpy(gsw_sms_msg.content, msg, strlen(msg));
426
427 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)
428 {
429 LOGE("sscanf failed\n");
430 }
431
432 snprintf((char *)gsw_sms_date.timezone, sizeof(gsw_sms_date.timezone), "%s","+8");
433
434 LOGE("Year: %s\n", (char*)gsw_sms_date.year);
435 LOGE("Month: %s\n", (char*)gsw_sms_date.month);
436 LOGE("Day: %s\n", (char*)gsw_sms_date.day);
437 LOGE("Hour: %s\n", (char*)gsw_sms_date.hour);
438 LOGE("Minute: %s\n", (char*)gsw_sms_date.minutes);
439 LOGE("Second: %s\n", (char*)gsw_sms_date.seconds);
440
441 gsw_sms_msg.date = gsw_sms_date;
442
443 if(gsw_sms_callback)
444 {
lichengzhang77046872025-07-07 11:45:51 +0800445 // if(total_pack > 1 && curr_pack < total_pack)
446 // {
b.liu68a94c92025-05-24 12:53:41 +0800447 gsw_sms_callback(GSW_SMS_RECEIVED_FLG, &gsw_sms_msg);
lichengzhang77046872025-07-07 11:45:51 +0800448 LOGD("the gsw_sms_state_e is %d\n",GSW_SMS_RECEIVED_FLG);
449 // }
450 // else
451 // {
452 // gsw_sms_callback(GSW_SMS_FULL_FLG, &gsw_sms_msg);
453 // }
b.liu68a94c92025-05-24 12:53:41 +0800454
455 }
456
457}
458
459
460/**
461 * @brief SDK interface to call back sms messages
462 * @param [in] handle_ptr
463 * @retval 0: success
464 * @retval other: fail
465 */
466int gsw_sms_reg_callback(GSW_SMS_Callback_fun handle_ptr)
467{
468 if(init_flag == 0)
469 {
470 return -1;
471 }
472
473 if(handle_ptr == NULL)
474 {
475 LOGE("gsw_sms_reg_callback fail,handle_ptr is null\n");
476 return -1;
477 }
478 else
479 {
480 gsw_sms_callback = handle_ptr;
481 }
482 return GSW_HAL_SUCCESS;
483}
484
485/**
486 * @brief sms sdk init
487 * @param [in] token
488 * @retval 0: success
489 * @retval other: fail
490 */
hong.liud2417072025-06-27 07:10:37 -0700491int gsw_sms_sdk_init(int32_t token)
b.liu68a94c92025-05-24 12:53:41 +0800492{
493 handle = token;
494 int ret = -1;
495
496 if(init_flag == 1)
497 {
498 LOGE("has init sms sdk,return\n");
499 return GSW_HAL_SUCCESS;
500 }
501
502 ret = mbtk_sms_import();
503 if(ret != 0)
504 {
505 if(mbtk_log != NULL)
506 {
507 LOGE("[gsw_sms_sdk_init]mbtk_sms_import fail\n");
508 }
xy.heb41615b2025-05-28 16:33:20 +0800509 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800510 }
511
lichengzhang77046872025-07-07 11:45:51 +0800512 //mbtk_log_init("syslog", "MBTK_RIL");
b.liu68a94c92025-05-24 12:53:41 +0800513
514 sms_info_handle = mbtk_info_handle_get();
515 if(sms_info_handle == NULL)
516 {
517 LOGE("[gsw_sms_sdk_init] mbtk handle init fail\n");
518 dlclose(dlHandle_mbtk);
xy.heb41615b2025-05-28 16:33:20 +0800519 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800520 }
521
522 ret = mbtk_sms_cnmi_set(sms_info_handle);
523 if(ret != 0)
524 {
525 LOGE("mbtk_sms_cnmi_set fail.[%d]\n", ret);
xy.heb41615b2025-05-28 16:33:20 +0800526 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800527 }
528
529 ret = mbtk_sms_state_change_cb_reg(sms_info_handle, gsw_sms_state_change_cb);
530 if(ret != 0)
531 {
532 LOGE("mbtk_sms_state_change_cb_reg fail.[%d]\n", ret);
533 if(sms_info_handle)
534 {
535 mbtk_info_handle_free(&sms_info_handle);
536 sms_info_handle = NULL;
537 }
xy.heb41615b2025-05-28 16:33:20 +0800538 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800539 }
540
541 LOGD("[gsw_sms_sdk_init]gsw_sms_sdk_init success\n");
542 init_flag = 1;
543 return GSW_HAL_SUCCESS;
544}
545
546/**
547 * @brief sms sdk deinit
548 * @param
549 * @retval 0: success
550 * @retval other: fail
551 */
552int gsw_sms_sdk_deinit(void)
553{
554 int ret = -1;
555
556 if(init_flag == 0)
557 {
558 return -1;
559 }
560
561 LOGD("callback clear\n");
562 gsw_sms_callback = NULL;
563
564 LOGD("handle_free\n");
565 if(sms_info_handle != NULL)
566 {
567 ret = mbtk_info_handle_free(&sms_info_handle);
568 if(ret != 0)
569 {
570 LOGE("[gsw_sms_sdk_deinit]mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800571 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800572 }
573 sms_info_handle = NULL;
574 }
575
576 LOGD("dlclose start\n");
577 if(dlHandle_mbtk == NULL)
578 {
579 LOGE("[gsw_sms_sdk_deinit]dlHandle_sms is null\n");
580 }
581 else
582 {
583 dlclose(dlHandle_mbtk);
584 }
585 LOGD("dlclose end\n");
586 init_flag = 0;
587 return GSW_HAL_SUCCESS;
588}
589
590/**
591 * @brief send sms fuction *
592 * @param [in] phone_num dest phone num send sms
593 * @param [in] char_set encode format for sms 0 7bit 1 binary 2 usc2
594 * @param [in] msg sms content
595 * @param [in] msg_len send sms length,max is 1024
596 * @retval 0: success
597 * @retval other: fail
598 */
599int gsw_send_sms(char *phone_num, int char_set, char *msg, int msg_len)
600{
601
602 if(init_flag == 0)
603 {
xy.heb41615b2025-05-28 16:33:20 +0800604 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800605 }
606
607 if(phone_num == NULL || msg == NULL)
608 {
xy.heb41615b2025-05-28 16:33:20 +0800609 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800610 }
611
612 if(strlen((char *)msg) > GSW_SMS_RECV_CONT_MAX || strlen((char *)msg) == 0 || strlen((char *)phone_num) == 0)
613 {
614 LOGE("strlen(telephony_num):%d", strlen((char *)phone_num));
615 LOGE("strlen(msg):%d", strlen((char *)msg));
xy.heb41615b2025-05-28 16:33:20 +0800616 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800617 }
618
619 int err = -1;
620
621 char smscPDU[30] = {0};
622 char **pdu = NULL;
623 char smsc[4] = {0};
624 char cmgs[MSM_NUMBER_MAX] = {0};
625 char resp[RES_NUM_MIN] = {0};
626 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
627
628 kal_int32 msg_num = 0;
629 kal_int32 pdu_msg_len = 0;
630 kal_int32 status = MDAPI_RET_ERROR;
631 kal_int32 index = 0;
632
633 if(char_set == 1) //8bit
634 {
635 ArrayToStr((unsigned char *)msg, (unsigned int)msg_len, msg_e_b);
636 status = _mdapi_sms_get_msg_num(msg_e_b, char_set, &msg_num, &pdu_msg_len);
637 }
638
639 else //7bit usc2
640 {
641 status = _mdapi_sms_get_msg_num((char *)msg, char_set, &msg_num, &pdu_msg_len);
642 }
643
644 LOGE("%s, %s, %d, msg_len = [%d] ,msg_num=[%d]\n", __FILE__, __FUNCTION__, __LINE__, msg_len, msg_num);
645 if(status == MDAPI_RET_ERROR)
646 {
647 LOGE("get message number failed\n");
xy.heb41615b2025-05-28 16:33:20 +0800648 //return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800649 }
650 else
651 {
652 //allocate memery for **pdu
653 pdu = (char **)malloc(sizeof(char *) * msg_num);
654 if(pdu == NULL)
655 {
656 LOGE("%s, %s, %d, allocate memory for pdu failed\n", __FILE__, __FUNCTION__, __LINE__);
xy.heb41615b2025-05-28 16:33:20 +0800657 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800658 }
659
660 else
661 {
662 for(index = 0; index < msg_num; index++)
663 {
664 pdu[index] = (char *)malloc(sizeof(char)*MAX_PDU_SIZE);
665 if(pdu[index] == NULL)
666 {
667 for(int i = 0; i < index; i++)
668 {
669 free(pdu[i]);
670 pdu[i] = NULL;
671 }
672 free(pdu);
673 pdu = NULL;
674 LOGE("%s, %s, %d, allocate memory for pdu[%d] failed\n", __FILE__, __FUNCTION__, __LINE__,index);
xy.heb41615b2025-05-28 16:33:20 +0800675 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800676 }
677 else
678 {
679 memset(pdu[index], 0, MAX_PDU_SIZE);
680 LOGE("%s, %s, %d, pdu[%d} init value is: %s \n", __FILE__, __FUNCTION__, __LINE__, index, pdu[index]);
681 }
682 }
683 }
684 }
685
686 //allocate memory for **pdu success
687 if(index == msg_num)
688 {
689 if(char_set == 1)//8bit
690 {
691 smsPduEncode(smsc, (char *)phone_num, msg_e_b, char_set, smscPDU, pdu);
692 }
693 else
694 {
695 smsPduEncode(smsc, (char *)phone_num, (char *)msg, char_set, smscPDU, pdu);
696 }
697 for(index = 0; index < msg_num; index++)
698 {
699 char pdu_data[MAX_PDU_SIZE] = {0};
700 char *p = pdu_data;
701
702 LOGE("index:%d\n",index);
703 LOGE("%s, %s, %d, smscPDU: %s, pdu: %s",__FILE__, __FUNCTION__, __LINE__, smscPDU, pdu[index]);
704 sprintf(p, "%s",smscPDU);
705 LOGE("pdu_data:%s\n", pdu_data);
706 int sc = strlen(pdu_data);
707 sprintf(p+strlen(p), "%s", pdu[index]);
708 LOGE("pdu_data:%s\n", pdu_data);
709
710 int t = strlen(pdu_data);
711 sprintf(cmgs, "%d,%s", (t-sc)/2, pdu_data);
712 LOGE("cmgs:%s\n", cmgs);
713 memset(resp, 0, sizeof(resp));
714
715 err = mbtk_sms_cmgf_set(sms_info_handle, 0);
716 if(err)
717 {
718 LOGE("cmgf set error : %d\n", err);
719 for(index = 0; index < msg_num; index++){
720 free(pdu[index]);
721 pdu[index] = NULL;
722 }
723 free(pdu);
724 pdu = NULL;
xy.heb41615b2025-05-28 16:33:20 +0800725 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800726 }
727 else
728 {
729 LOGD("cmgf set success\n");
730 }
731
732 err = mbtk_sms_cmgs_set(sms_info_handle, cmgs, resp);
733 if(err)
734 {
735 LOGE("cmgs send fail\n");
736 for(index = 0; index < msg_num; index++){
737 free(pdu[index]);
738 pdu[index] = NULL;
739 }
740 free(pdu);
741 pdu = NULL;
xy.heb41615b2025-05-28 16:33:20 +0800742 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800743 }
744 else
745 {
746 LOGD("cmgs send success, resp:%s\n", resp);
747 }
748
749 }
750 }
751
752 for(index = 0; index < msg_num; index++){
753 free(pdu[index]);
754 pdu[index] = NULL;
755 }
756 free(pdu);
757 pdu = NULL;
758
759 return GSW_HAL_SUCCESS;
760}
761
762
763/**
764 * @brief get smsc fuction *
765 * @param [in] len input buf len for smsc,max is 32
766 * @param [out] smsc address for smsc get from this func *
767 * @retval 0: success
768 * @retval other: fail
769 */
770int gsw_get_smsc_address(int len, char *smsc)
771{
772 int ret = -1;
773 int len_t = 0;
774 char smsc_temp[SMSC_MAX_LEN] = {0};
775 char *p1, *p2 ,*substr;
776
777 if(init_flag == 0)
778 {
xy.heb41615b2025-05-28 16:33:20 +0800779 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800780 }
781
782 if(smsc == NULL || len <= 0)
783 {
784 LOGE("smsc is null or len = %d\n",len);
xy.heb41615b2025-05-28 16:33:20 +0800785 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800786 }
787
788 ret = mbtk_sms_csca_get(sms_info_handle, smsc_temp);
789 if(smsc_temp[0] == '\0')
790 {
791 LOGE("gsw_get_smsc_address Error : %d\n", ret);
xy.heb41615b2025-05-28 16:33:20 +0800792 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800793 }
794
795 else
796 {
797 p1 = strchr(smsc_temp, '\"');
798 p2 = strrchr(smsc_temp, '\"');
799 if (p1 && p2 && p2 > p1)
800 {
801 len_t = p2 - p1 - 1;
hong.liud2417072025-06-27 07:10:37 -0700802 substr = malloc(len_t + 1);
803 if (NULL == substr)
b.liu68a94c92025-05-24 12:53:41 +0800804 {
hong.liud2417072025-06-27 07:10:37 -0700805 LOGE("substr = NULL, malloc faill!!!\n");
806 return GSW_HAL_NO_MEMORY;
b.liu68a94c92025-05-24 12:53:41 +0800807 }
hong.liud2417072025-06-27 07:10:37 -0700808 strncpy(substr, p1 + 1, len_t);
809 substr[len_t] = '\0';
b.liu68a94c92025-05-24 12:53:41 +0800810 memcpy(smsc, substr, strlen(substr));
811 memcpy(sms_center_address, substr, strlen(substr));
812
813 LOGE("qser_sms_getsmscenteraddress success, smsc = %s\n", sms_center_address);
hong.liud2417072025-06-27 07:10:37 -0700814 free(substr);
815 substr = NULL;
b.liu68a94c92025-05-24 12:53:41 +0800816 }
817 else
818 {
819 LOGE("String inside double quotes not found\n");
xy.heb41615b2025-05-28 16:33:20 +0800820 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800821 }
822 }
823
824
825 return GSW_HAL_SUCCESS;
826}
827
828/**
829 * @brief set smsc fuction
830 * @param [out] smsc string value for smsc,max length is 32 *
831 * @retval 0: success
832 * @retval other: fail
833 */
834int gsw_set_smsc_address(const char *smsc)
835{
836 int ret = -1;
837
838 if(init_flag == 0)
839 {
xy.heb41615b2025-05-28 16:33:20 +0800840 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800841 }
842
843 if(smsc == NULL || strlen((char *)smsc) == 0)
844 {
845 LOGE("smsc is null or empty\n");
xy.heb41615b2025-05-28 16:33:20 +0800846 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800847 }
848
849 ret = mbtk_sms_csca_set(sms_info_handle, (char *)smsc);
850
851 if(ret == 0)
852 {
853 LOGE("set smsc success,smsc = %s\n",smsc);
854 }
855 else
856 {
857 LOGE("set smsc fail,ret = %d\n", ret);
xy.heb41615b2025-05-28 16:33:20 +0800858 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800859 }
860
861 return GSW_HAL_SUCCESS;
862}