blob: bf27db31500bf5a043b916f9f1d60e253edccea3 [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#include "gsw_nw_interface.h"
2#include <stdio.h>
3#include <stdlib.h>
4#include <stdint.h>
5#include <dlfcn.h>
6#include <time.h>
7
8typedef unsigned short uint16_t;
9typedef unsigned int uint32_t;
10typedef unsigned char uint8_t;
11typedef unsigned short uint16;
12typedef uint32_t sms_client_handle_type;
13typedef int kal_int32;
14
15
16//qser include
17
18
19
20//mbtk include
21typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
22typedef unsigned char uint8;
23
24typedef struct
25{
26 int client_fd;
27 pthread_t read_thread_id;
28 int exit_fd[2];
29 bool is_waitting;
30 pthread_cond_t cond;
31 pthread_mutex_t mutex;
32
33 pthread_mutex_t send_mutex;
34
35 // Temp response data.
36 uint16 info_err;
37 uint16 data_len;
38 void *data;
39
40 //mbtk wyq for server_ready_status add start
41 char server_ready_status;
42 //mbtk wyq for server_ready_status add end
43
44 mbtk_info_callback_func net_state_cb;
45 mbtk_info_callback_func call_state_cb;
46 mbtk_info_callback_func sms_state_cb;
47 mbtk_info_callback_func radio_state_cb;
48 mbtk_info_callback_func sim_state_cb;
49 mbtk_info_callback_func pdp_state_cb;
50 //add signal by xr
51 mbtk_info_callback_func signal_state_cb;
52} mbtk_info_handle_t;
53
54// PDU include
55enum EnumDCS {
56 BIT7 = 0, // GSM 字符集
57 BIT8 = 1, // ASCII字符集
58 UCS2 = 2 // Unicode 字符集
59};
60
61struct SMS_Struct {
62 char *SCA; // 服务中心地址
63 char *OA; // 发送方地址
64 char *SCTS; // 服务中心时间戳
65 struct UDHS *UDH; // 用户数据头
66 char *UD; // 用户数据
67
68 bool RP; // 应答路径
69 bool UDHI; // 用户数据头标识
70 bool SRI; // 状态报告指示
71 bool MMS; // 更多信息发送
72 int MTI; // 信息类型指示
73
74 char PID; // PID 协议标识
75
76 enum EnumDCS DCS; // 数据编码方案
77 bool TC; // 文本压缩指示 0: 未压缩 1:压缩
78 int MC; // 消息类型 -1: 无 1:移动设备特定类型 2:SIM特定类型 3:终端设备特定类型
79
80};
81
82struct PDUS {
83 unsigned int count;
84 char **PDU;
85};
86
87enum MDAPI_RET_e {
88 MDAPI_RET_SUCCESS = 0,
89 MDAPI_RET_ERROR = 1,
90 MDAPI_RET_TIMEOUT = 2,
91 MDAPI_RET_NOT_SUPPORT = 3,
92};
93
94#define MDAPI_TIME_STR_SIZE 22
95#define MDAPI_PHONE_NUMBER_SIZE 32
96#define MDAPI_MAX_PDU_SIZE 512
97#define MSM_NUMBER_MAX 2048+1
98#define RES_NUM_MIN 128
99#define MIN_MSM_PARAM_NUM 4
100#define MIN_IMS_MSM_PARAM_NUM 6
101#define MIN_WRITMSM_PARAM_NUM 5
102#define MSG_MAX_LEN 1024
103#define TELEPHONNUM_LEN 64
104#define STORAGSMS_MAX_SIZE 128
105#define SMSC_MAX_LEN 22
106#define SMS_NUM_MAX 255
107#define MAX_OUT_SIZE 512
108#define MAX_PDU_SIZE 512
109#define MAX_DATE_SIZE 32
110
111
112GSW_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 {
445 if(total_pack > 1 && curr_pack < total_pack)
446 {
447 gsw_sms_callback(GSW_SMS_RECEIVED_FLG, &gsw_sms_msg);
448 }
449 else
450 {
451 gsw_sms_callback(GSW_SMS_FULL_FLG, &gsw_sms_msg);
452 }
453
454 }
455
456}
457
458
459/**
460 * @brief SDK interface to call back sms messages
461 * @param [in] handle_ptr
462 * @retval 0: success
463 * @retval other: fail
464 */
465int gsw_sms_reg_callback(GSW_SMS_Callback_fun handle_ptr)
466{
467 if(init_flag == 0)
468 {
469 return -1;
470 }
471
472 if(handle_ptr == NULL)
473 {
474 LOGE("gsw_sms_reg_callback fail,handle_ptr is null\n");
475 return -1;
476 }
477 else
478 {
479 gsw_sms_callback = handle_ptr;
480 }
481 return GSW_HAL_SUCCESS;
482}
483
484/**
485 * @brief sms sdk init
486 * @param [in] token
487 * @retval 0: success
488 * @retval other: fail
489 */
490int gsw_sms_sdk_init(int token)
491{
492 handle = token;
493 int ret = -1;
494
495 if(init_flag == 1)
496 {
497 LOGE("has init sms sdk,return\n");
498 return GSW_HAL_SUCCESS;
499 }
500
501 ret = mbtk_sms_import();
502 if(ret != 0)
503 {
504 if(mbtk_log != NULL)
505 {
506 LOGE("[gsw_sms_sdk_init]mbtk_sms_import fail\n");
507 }
xy.heb41615b2025-05-28 16:33:20 +0800508 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800509 }
510
511 mbtk_log_init("syslog", "MBTK_RIL");
512
513 sms_info_handle = mbtk_info_handle_get();
514 if(sms_info_handle == NULL)
515 {
516 LOGE("[gsw_sms_sdk_init] mbtk handle init fail\n");
517 dlclose(dlHandle_mbtk);
xy.heb41615b2025-05-28 16:33:20 +0800518 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800519 }
520
521 ret = mbtk_sms_cnmi_set(sms_info_handle);
522 if(ret != 0)
523 {
524 LOGE("mbtk_sms_cnmi_set fail.[%d]\n", ret);
xy.heb41615b2025-05-28 16:33:20 +0800525 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800526 }
527
528 ret = mbtk_sms_state_change_cb_reg(sms_info_handle, gsw_sms_state_change_cb);
529 if(ret != 0)
530 {
531 LOGE("mbtk_sms_state_change_cb_reg fail.[%d]\n", ret);
532 if(sms_info_handle)
533 {
534 mbtk_info_handle_free(&sms_info_handle);
535 sms_info_handle = NULL;
536 }
xy.heb41615b2025-05-28 16:33:20 +0800537 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800538 }
539
540 LOGD("[gsw_sms_sdk_init]gsw_sms_sdk_init success\n");
541 init_flag = 1;
542 return GSW_HAL_SUCCESS;
543}
544
545/**
546 * @brief sms sdk deinit
547 * @param
548 * @retval 0: success
549 * @retval other: fail
550 */
551int gsw_sms_sdk_deinit(void)
552{
553 int ret = -1;
554
555 if(init_flag == 0)
556 {
557 return -1;
558 }
559
560 LOGD("callback clear\n");
561 gsw_sms_callback = NULL;
562
563 LOGD("handle_free\n");
564 if(sms_info_handle != NULL)
565 {
566 ret = mbtk_info_handle_free(&sms_info_handle);
567 if(ret != 0)
568 {
569 LOGE("[gsw_sms_sdk_deinit]mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800570 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800571 }
572 sms_info_handle = NULL;
573 }
574
575 LOGD("dlclose start\n");
576 if(dlHandle_mbtk == NULL)
577 {
578 LOGE("[gsw_sms_sdk_deinit]dlHandle_sms is null\n");
579 }
580 else
581 {
582 dlclose(dlHandle_mbtk);
583 }
584 LOGD("dlclose end\n");
585 init_flag = 0;
586 return GSW_HAL_SUCCESS;
587}
588
589/**
590 * @brief send sms fuction *
591 * @param [in] phone_num dest phone num send sms
592 * @param [in] char_set encode format for sms 0 7bit 1 binary 2 usc2
593 * @param [in] msg sms content
594 * @param [in] msg_len send sms length,max is 1024
595 * @retval 0: success
596 * @retval other: fail
597 */
598int gsw_send_sms(char *phone_num, int char_set, char *msg, int msg_len)
599{
600
601 if(init_flag == 0)
602 {
xy.heb41615b2025-05-28 16:33:20 +0800603 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800604 }
605
606 if(phone_num == NULL || msg == NULL)
607 {
xy.heb41615b2025-05-28 16:33:20 +0800608 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800609 }
610
611 if(strlen((char *)msg) > GSW_SMS_RECV_CONT_MAX || strlen((char *)msg) == 0 || strlen((char *)phone_num) == 0)
612 {
613 LOGE("strlen(telephony_num):%d", strlen((char *)phone_num));
614 LOGE("strlen(msg):%d", strlen((char *)msg));
xy.heb41615b2025-05-28 16:33:20 +0800615 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800616 }
617
618 int err = -1;
619
620 char smscPDU[30] = {0};
621 char **pdu = NULL;
622 char smsc[4] = {0};
623 char cmgs[MSM_NUMBER_MAX] = {0};
624 char resp[RES_NUM_MIN] = {0};
625 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
626
627 kal_int32 msg_num = 0;
628 kal_int32 pdu_msg_len = 0;
629 kal_int32 status = MDAPI_RET_ERROR;
630 kal_int32 index = 0;
631
632 if(char_set == 1) //8bit
633 {
634 ArrayToStr((unsigned char *)msg, (unsigned int)msg_len, msg_e_b);
635 status = _mdapi_sms_get_msg_num(msg_e_b, char_set, &msg_num, &pdu_msg_len);
636 }
637
638 else //7bit usc2
639 {
640 status = _mdapi_sms_get_msg_num((char *)msg, char_set, &msg_num, &pdu_msg_len);
641 }
642
643 LOGE("%s, %s, %d, msg_len = [%d] ,msg_num=[%d]\n", __FILE__, __FUNCTION__, __LINE__, msg_len, msg_num);
644 if(status == MDAPI_RET_ERROR)
645 {
646 LOGE("get message number failed\n");
xy.heb41615b2025-05-28 16:33:20 +0800647 //return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800648 }
649 else
650 {
651 //allocate memery for **pdu
652 pdu = (char **)malloc(sizeof(char *) * msg_num);
653 if(pdu == NULL)
654 {
655 LOGE("%s, %s, %d, allocate memory for pdu failed\n", __FILE__, __FUNCTION__, __LINE__);
xy.heb41615b2025-05-28 16:33:20 +0800656 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800657 }
658
659 else
660 {
661 for(index = 0; index < msg_num; index++)
662 {
663 pdu[index] = (char *)malloc(sizeof(char)*MAX_PDU_SIZE);
664 if(pdu[index] == NULL)
665 {
666 for(int i = 0; i < index; i++)
667 {
668 free(pdu[i]);
669 pdu[i] = NULL;
670 }
671 free(pdu);
672 pdu = NULL;
673 LOGE("%s, %s, %d, allocate memory for pdu[%d] failed\n", __FILE__, __FUNCTION__, __LINE__,index);
xy.heb41615b2025-05-28 16:33:20 +0800674 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800675 }
676 else
677 {
678 memset(pdu[index], 0, MAX_PDU_SIZE);
679 LOGE("%s, %s, %d, pdu[%d} init value is: %s \n", __FILE__, __FUNCTION__, __LINE__, index, pdu[index]);
680 }
681 }
682 }
683 }
684
685 //allocate memory for **pdu success
686 if(index == msg_num)
687 {
688 if(char_set == 1)//8bit
689 {
690 smsPduEncode(smsc, (char *)phone_num, msg_e_b, char_set, smscPDU, pdu);
691 }
692 else
693 {
694 smsPduEncode(smsc, (char *)phone_num, (char *)msg, char_set, smscPDU, pdu);
695 }
696 for(index = 0; index < msg_num; index++)
697 {
698 char pdu_data[MAX_PDU_SIZE] = {0};
699 char *p = pdu_data;
700
701 LOGE("index:%d\n",index);
702 LOGE("%s, %s, %d, smscPDU: %s, pdu: %s",__FILE__, __FUNCTION__, __LINE__, smscPDU, pdu[index]);
703 sprintf(p, "%s",smscPDU);
704 LOGE("pdu_data:%s\n", pdu_data);
705 int sc = strlen(pdu_data);
706 sprintf(p+strlen(p), "%s", pdu[index]);
707 LOGE("pdu_data:%s\n", pdu_data);
708
709 int t = strlen(pdu_data);
710 sprintf(cmgs, "%d,%s", (t-sc)/2, pdu_data);
711 LOGE("cmgs:%s\n", cmgs);
712 memset(resp, 0, sizeof(resp));
713
714 err = mbtk_sms_cmgf_set(sms_info_handle, 0);
715 if(err)
716 {
717 LOGE("cmgf set error : %d\n", err);
718 for(index = 0; index < msg_num; index++){
719 free(pdu[index]);
720 pdu[index] = NULL;
721 }
722 free(pdu);
723 pdu = NULL;
xy.heb41615b2025-05-28 16:33:20 +0800724 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800725 }
726 else
727 {
728 LOGD("cmgf set success\n");
729 }
730
731 err = mbtk_sms_cmgs_set(sms_info_handle, cmgs, resp);
732 if(err)
733 {
734 LOGE("cmgs send fail\n");
735 for(index = 0; index < msg_num; index++){
736 free(pdu[index]);
737 pdu[index] = NULL;
738 }
739 free(pdu);
740 pdu = NULL;
xy.heb41615b2025-05-28 16:33:20 +0800741 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800742 }
743 else
744 {
745 LOGD("cmgs send success, resp:%s\n", resp);
746 }
747
748 }
749 }
750
751 for(index = 0; index < msg_num; index++){
752 free(pdu[index]);
753 pdu[index] = NULL;
754 }
755 free(pdu);
756 pdu = NULL;
757
758 return GSW_HAL_SUCCESS;
759}
760
761
762/**
763 * @brief get smsc fuction *
764 * @param [in] len input buf len for smsc,max is 32
765 * @param [out] smsc address for smsc get from this func *
766 * @retval 0: success
767 * @retval other: fail
768 */
769int gsw_get_smsc_address(int len, char *smsc)
770{
771 int ret = -1;
772 int len_t = 0;
773 char smsc_temp[SMSC_MAX_LEN] = {0};
774 char *p1, *p2 ,*substr;
775
776 if(init_flag == 0)
777 {
xy.heb41615b2025-05-28 16:33:20 +0800778 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800779 }
780
781 if(smsc == NULL || len <= 0)
782 {
783 LOGE("smsc is null or len = %d\n",len);
xy.heb41615b2025-05-28 16:33:20 +0800784 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800785 }
786
787 ret = mbtk_sms_csca_get(sms_info_handle, smsc_temp);
788 if(smsc_temp[0] == '\0')
789 {
790 LOGE("gsw_get_smsc_address Error : %d\n", ret);
xy.heb41615b2025-05-28 16:33:20 +0800791 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800792 }
793
794 else
795 {
796 p1 = strchr(smsc_temp, '\"');
797 p2 = strrchr(smsc_temp, '\"');
798 if (p1 && p2 && p2 > p1)
799 {
800 len_t = p2 - p1 - 1;
801 char* substr_t = NULL;
802 substr_t = (char *)malloc(len_t + 1);
803 if(substr_t == NULL)
804 {
805 LOGE("malloc substr_t fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800806 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800807 }
808 strncpy(substr_t, p1 + 1, len_t);
809 substr_t[len_t] = '\0';
810
811 substr = substr_t;
812
813 memcpy(smsc, substr, strlen(substr));
814 memcpy(sms_center_address, substr, strlen(substr));
815
816 LOGE("qser_sms_getsmscenteraddress success, smsc = %s\n", sms_center_address);
817 free(substr_t);
818 }
819 else
820 {
821 LOGE("String inside double quotes not found\n");
xy.heb41615b2025-05-28 16:33:20 +0800822 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800823 }
824 }
825
826
827 return GSW_HAL_SUCCESS;
828}
829
830/**
831 * @brief set smsc fuction
832 * @param [out] smsc string value for smsc,max length is 32 *
833 * @retval 0: success
834 * @retval other: fail
835 */
836int gsw_set_smsc_address(const char *smsc)
837{
838 int ret = -1;
839
840 if(init_flag == 0)
841 {
xy.heb41615b2025-05-28 16:33:20 +0800842 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800843 }
844
845 if(smsc == NULL || strlen((char *)smsc) == 0)
846 {
847 LOGE("smsc is null or empty\n");
xy.heb41615b2025-05-28 16:33:20 +0800848 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800849 }
850
851 ret = mbtk_sms_csca_set(sms_info_handle, (char *)smsc);
852
853 if(ret == 0)
854 {
855 LOGE("set smsc success,smsc = %s\n",smsc);
856 }
857 else
858 {
859 LOGE("set smsc fail,ret = %d\n", ret);
xy.heb41615b2025-05-28 16:33:20 +0800860 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800861 }
862
863 return GSW_HAL_SUCCESS;
864}