blob: e33def841d58bd8d0bc64ebc4942d27c4eb298e0 [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
117#define GSW_HAL_FAIL GSW_HAL_NORMAL_FAIL
118#define GSW_HAL_MEM_INVAILD GSW_HAL_ARG_INVALID
119
120
121static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
122int (*mbtk_sms_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
123static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
124struct SMS_Struct (*PDUDecoding)(const char *data);
125char *(*SCADecoding)(const char *data, int *EndIndex);
126char *(*SCAEncoding)(char *SCA);
127struct PDUS *(*PDUEncoding)(char *SCA, char *DA, char *UDC, struct UDHS *udhs);
128int (*mbtk_sms_cmgf_set)(mbtk_info_handle_t* handle, int mode);
129int (*mbtk_sms_cmgs_set)(mbtk_info_handle_t* handle, char * cmgs, char *resp);
130int (*mbtk_sms_csca_set)(mbtk_info_handle_t* handle, char * csca);
131int (*mbtk_sms_csca_get)(mbtk_info_handle_t* handle, char *buf);
132int (*mbtk_sms_cnmi_set)(mbtk_info_handle_t* handle);
133static void (*mbtk_log)(int level, const char *format, ...);
134static void (*mbtk_log_init)(char *path, char *tag);
135int (*smsPduEncode)(const char *smsc, const char *da_num, const char *msg, int charset, char *smsc_pdu, char **pdu);
136int (*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);
137kal_int32 (*_mdapi_sms_get_msg_num)(const char *msg, int charset, kal_int32 *msg_num, kal_int32 *msg_len);
138
139#ifndef LOG_ERR_LEVEL
140#define LOG_ERR_LEVEL 3 /* error conditions */
141#endif
142#ifndef LOG_WARN_LEVEL
143#define LOG_WARN_LEVEL 4 /* warning conditions */
144#endif
145#ifndef LOG_INFO_LEVEL
146#define LOG_INFO_LEVEL 6 /* informational */
147#endif
148#ifndef LOG_DEBUG_LEVEL
149#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
150#endif
151#ifndef LOG_VERBOSE_LEVEL
152#define LOG_VERBOSE_LEVEL 8
153#endif
l.yang6a42e4d2025-05-28 01:04:20 -0700154#define GSW_SMS "[HAL][GSW_SMS]"
b.liu68a94c92025-05-24 12:53:41 +0800155
156#define LOGV(fmt, args ...) \
157 do{ \
158 char *file_ptr_1001 = __FILE__; \
159 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
160 char line_1001[10] = {0}; \
161 sprintf(line_1001, "%d", __LINE__); \
162 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
163 if(*ptr_1001 == '/') \
164 break; \
165 ptr_1001--; \
166 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700167 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_SMS"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800168 } while(0)
169
170#define LOGI(fmt, args...) \
171 do{ \
172 char *file_ptr_1001 = __FILE__; \
173 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
174 char line_1001[10] = {0}; \
175 sprintf(line_1001, "%d", __LINE__); \
176 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
177 if(*ptr_1001 == '/') \
178 break; \
179 ptr_1001--; \
180 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700181 mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_SMS"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800182 } while(0)
183
184#define LOGD(fmt, args...) \
185 do{ \
186 char *file_ptr_1001 = __FILE__; \
187 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
188 char line_1001[10] = {0}; \
189 sprintf(line_1001, "%d", __LINE__); \
190 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
191 if(*ptr_1001 == '/') \
192 break; \
193 ptr_1001--; \
194 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700195 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_SMS"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800196 } while(0)
197
198#define LOGW(fmt, args...) \
199 do{ \
200 char *file_ptr_1001 = __FILE__; \
201 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
202 char line_1001[10] = {0}; \
203 sprintf(line_1001, "%d", __LINE__); \
204 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
205 if(*ptr_1001 == '/') \
206 break; \
207 ptr_1001--; \
208 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700209 mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_SMS"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800210 } while(0)
211
212#define LOGE(fmt, args...) \
213 do{ \
214 char *file_ptr_1001 = __FILE__; \
215 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
216 char line_1001[10] = {0}; \
217 sprintf(line_1001, "%d", __LINE__); \
218 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
219 if(*ptr_1001 == '/') \
220 break; \
221 ptr_1001--; \
222 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700223 mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_SMS"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800224 } while(0)
225
226
227
228static mbtk_info_handle_t* sms_info_handle = NULL;
229static sms_client_handle_type handle;
230static char sms_center_address[SMSC_MAX_LEN] = {0};
231static void *dlHandle_mbtk;
232static int init_flag = 0;
233
234static int mbtk_sms_import()
235{
236 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
237 if (dlHandle_mbtk == NULL)
238 {
239 return GSW_HAL_FAIL;
240 }
241
242 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
243 if (mbtk_log_init == NULL)
244 {
245 return GSW_HAL_FAIL;
246 }
247
248 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
249 if (mbtk_log == NULL)
250 {
251 return GSW_HAL_FAIL;
252 }
253
254 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
255 if (mbtk_info_handle_get == NULL)
256 {
257 LOGE("mbtk_info_handle_get dlsym fail\n");
258 return GSW_HAL_FAIL;
259 }
260
261 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");
262 if (mbtk_sms_state_change_cb_reg == NULL)
263 {
264 LOGE("mbtk_sms_state_change_cb_reg dlsym fail\n");
265 return GSW_HAL_FAIL;
266 }
267
268 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
269 if (mbtk_info_handle_free == NULL)
270 {
271 LOGE("mbtk_info_handle_free dlsym fail\n");
272 return GSW_HAL_FAIL;
273 }
274
275 PDUDecoding = (struct SMS_Struct (*)(const char *data))dlsym(dlHandle_mbtk, "PDUDecoding");
276 if (PDUDecoding == NULL)
277 {
278 LOGE("PDUDecoding dlsym fail\n");
279 return GSW_HAL_FAIL;
280 }
281
282 SCADecoding = (char *(*)(const char *data, int *EndIndex))dlsym(dlHandle_mbtk, "SCADecoding");
283 if (SCADecoding == NULL)
284 {
285 LOGE("SCADecoding dlsym fail\n");
286 return GSW_HAL_FAIL;
287 }
288
289 SCAEncoding = (char *(*)(char *SCA))dlsym(dlHandle_mbtk, "SCAEncoding");
290 if (SCAEncoding == NULL)
291 {
292 LOGE("SCAEncoding dlsym fail\n");
293 return GSW_HAL_FAIL;
294 }
295
296 PDUEncoding = (struct PDUS *(*)(char *SCA, char *DA, char *UDC, struct UDHS *udhs))dlsym(dlHandle_mbtk, "PDUEncoding");
297 if (PDUEncoding == NULL)
298 {
299 LOGE("PDUEncoding dlsym fail\n");
300 return GSW_HAL_FAIL;
301 }
302
303 mbtk_sms_cmgf_set = (int (*)(mbtk_info_handle_t* handle, int mode))dlsym(dlHandle_mbtk, "mbtk_sms_cmgf_set");
304 if (mbtk_sms_cmgf_set == NULL)
305 {
306 LOGE("mbtk_sms_cmgf_set dlsym fail\n");
307 return GSW_HAL_FAIL;
308 }
309
310 mbtk_sms_cmgs_set = (int (*)(mbtk_info_handle_t* handle, char * cmgs, char *resp))dlsym(dlHandle_mbtk, "mbtk_sms_cmgs_set");
311 if (mbtk_sms_cmgs_set == NULL)
312 {
313 LOGE("mbtk_sms_cmgs_set dlsym fail\n");
314 return GSW_HAL_FAIL;
315 }
316
317 mbtk_sms_csca_set = (int (*)(mbtk_info_handle_t* handle, char * csca))dlsym(dlHandle_mbtk, "mbtk_sms_csca_set");
318 if (mbtk_sms_csca_set == NULL)
319 {
320 LOGE("mbtk_sms_csca_set dlsym fail\n");
321 return GSW_HAL_FAIL;
322 }
323
324 mbtk_sms_csca_get = (int (*)(mbtk_info_handle_t* handle, char *buf))dlsym(dlHandle_mbtk, "mbtk_sms_csca_get");
325 if (mbtk_sms_csca_get == NULL)
326 {
327 LOGE("mbtk_sms_csca_get dlsym fail\n");
328 return GSW_HAL_FAIL;
329 }
330
331 mbtk_sms_cnmi_set = (int (*)(mbtk_info_handle_t* handle))dlsym(dlHandle_mbtk, "mbtk_sms_cnmi_set");
332 if (mbtk_sms_cnmi_set == NULL)
333 {
334 LOGE("mbtk_sms_cnmi_set dlsym fail\n");
335 return GSW_HAL_FAIL;
336 }
337
338 smsPduEncode = (int (*)(const char *smsc, const char *da_num, const char *msg, int charset, char *smsc_pdu, char **pdu))dlsym(dlHandle_mbtk, "smsPduEncode");
339 if (smsPduEncode == NULL)
340 {
341 LOGE("smsPduEncode dlsym fail\n");
342 return GSW_HAL_FAIL;
343 }
344
345
346 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");
347 if (smsPduDecode == NULL)
348 {
349 LOGE("smsPduDecode dlsym fail\n");
350 return GSW_HAL_FAIL;
351 }
352
353 _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");
354 if (_mdapi_sms_get_msg_num == NULL)
355 {
356 LOGE("_mdapi_sms_get_msg_num dlsym fail");
357 return GSW_HAL_FAIL;
358 }
359
360 return GSW_HAL_SUCCESS;
361
362}
363
364void ArrayToStr(unsigned char *Buff, unsigned int BuffLen, char *OutputStr)
365{
366 int i = 0;
367 char TempBuff[MSG_MAX_LEN * 2 +1] = {0};
368 char strBuff[MSG_MAX_LEN * 2 +1] = {0};
369
370 for(i = 0; i<BuffLen;i++)
371 {
372 sprintf(TempBuff,"%02x",(unsigned char)Buff[i]);
373 strncat(strBuff,TempBuff,BuffLen*2);
374 }
375 strncpy(OutputStr, strBuff, BuffLen*2);
376 return;
377}
378
379void gsw_sms_state_change_cb(const void* data, int data_len) {
380 LOGD("gsw_sms_state_change_cb -------start\n");
381
382 uint8 *ptr = (uint8*)data;
383
384 if (!strncmp("+CMT:", (const char *)ptr, 5))//丢弃无用消息
385 return ;
386
387 gsw_sms_msg_type_t gsw_sms_msg;
388 gsw_sms_date_t gsw_sms_date;
389
390 memset(&gsw_sms_msg, 0, sizeof(gsw_sms_msg_type_t));
391 memset(&gsw_sms_date, 0, sizeof(gsw_sms_date_t));
392
393 char smsc[MDAPI_MAX_PDU_SIZE] = {0};
394 char received_pdu[MDAPI_MAX_PDU_SIZE] = {0};
395 char msg[MDAPI_MAX_PDU_SIZE] = {0};
396 char num[MDAPI_MAX_PDU_SIZE] = {0};
397 char date[MAX_DATE_SIZE] = {0};
398 int charset = 0;
399 int ret = -1;
400 int curr_pack = 1;
401 int total_pack = 1;
402 if(ptr == NULL)
403 {
404 LOGE("ptr is null");
405 }
406 LOGE("ptr: %s\n,data_len = %d\n", (char *)ptr, data_len);
407 if(data_len > MDAPI_MAX_PDU_SIZE)
408 {
409 strncpy(received_pdu, (const char *)ptr, MDAPI_MAX_PDU_SIZE-1);
410 }
411 else
412 {
413 strncpy(received_pdu, (const char *)ptr, data_len);
414 }
415 ret = smsPduDecode((const char *)received_pdu, data_len, num, smsc, msg, &charset, &curr_pack, &total_pack,date);
416 if(ret != 0)
417 {
418 LOGE("smsPduDecode fail\n");
419 return ;
420 }
421 LOGE("smsPduDecode ret: %d\n", ret);
422 LOGE("SMS :%s, %s, %d\n", __FILE__, __FUNCTION__, __LINE__);
423 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);
424
425 gsw_sms_msg.content_encode = charset;
426 memcpy(gsw_sms_msg.src_num, num, strlen(num));
427 gsw_sms_msg.content_len = strlen(msg);
428 memcpy(gsw_sms_msg.content, msg, strlen(msg));
429
430 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)
431 {
432 LOGE("sscanf failed\n");
433 }
434
435 snprintf((char *)gsw_sms_date.timezone, sizeof(gsw_sms_date.timezone), "%s","+8");
436
437 LOGE("Year: %s\n", (char*)gsw_sms_date.year);
438 LOGE("Month: %s\n", (char*)gsw_sms_date.month);
439 LOGE("Day: %s\n", (char*)gsw_sms_date.day);
440 LOGE("Hour: %s\n", (char*)gsw_sms_date.hour);
441 LOGE("Minute: %s\n", (char*)gsw_sms_date.minutes);
442 LOGE("Second: %s\n", (char*)gsw_sms_date.seconds);
443
444 gsw_sms_msg.date = gsw_sms_date;
445
446 if(gsw_sms_callback)
447 {
448 if(total_pack > 1 && curr_pack < total_pack)
449 {
450 gsw_sms_callback(GSW_SMS_RECEIVED_FLG, &gsw_sms_msg);
451 }
452 else
453 {
454 gsw_sms_callback(GSW_SMS_FULL_FLG, &gsw_sms_msg);
455 }
456
457 }
458
459}
460
461
462/**
463 * @brief SDK interface to call back sms messages
464 * @param [in] handle_ptr
465 * @retval 0: success
466 * @retval other: fail
467 */
468int gsw_sms_reg_callback(GSW_SMS_Callback_fun handle_ptr)
469{
470 if(init_flag == 0)
471 {
472 return -1;
473 }
474
475 if(handle_ptr == NULL)
476 {
477 LOGE("gsw_sms_reg_callback fail,handle_ptr is null\n");
478 return -1;
479 }
480 else
481 {
482 gsw_sms_callback = handle_ptr;
483 }
484 return GSW_HAL_SUCCESS;
485}
486
487/**
488 * @brief sms sdk init
489 * @param [in] token
490 * @retval 0: success
491 * @retval other: fail
492 */
493int gsw_sms_sdk_init(int token)
494{
495 handle = token;
496 int ret = -1;
497
498 if(init_flag == 1)
499 {
500 LOGE("has init sms sdk,return\n");
501 return GSW_HAL_SUCCESS;
502 }
503
504 ret = mbtk_sms_import();
505 if(ret != 0)
506 {
507 if(mbtk_log != NULL)
508 {
509 LOGE("[gsw_sms_sdk_init]mbtk_sms_import fail\n");
510 }
511 return GSW_HAL_FAIL;
512 }
513
514 mbtk_log_init("syslog", "MBTK_RIL");
515
516 sms_info_handle = mbtk_info_handle_get();
517 if(sms_info_handle == NULL)
518 {
519 LOGE("[gsw_sms_sdk_init] mbtk handle init fail\n");
520 dlclose(dlHandle_mbtk);
521 return GSW_HAL_FAIL;
522 }
523
524 ret = mbtk_sms_cnmi_set(sms_info_handle);
525 if(ret != 0)
526 {
527 LOGE("mbtk_sms_cnmi_set fail.[%d]\n", ret);
528 return GSW_HAL_FAIL;
529 }
530
531 ret = mbtk_sms_state_change_cb_reg(sms_info_handle, gsw_sms_state_change_cb);
532 if(ret != 0)
533 {
534 LOGE("mbtk_sms_state_change_cb_reg fail.[%d]\n", ret);
535 if(sms_info_handle)
536 {
537 mbtk_info_handle_free(&sms_info_handle);
538 sms_info_handle = NULL;
539 }
540 return GSW_HAL_FAIL;
541 }
542
543 LOGD("[gsw_sms_sdk_init]gsw_sms_sdk_init success\n");
544 init_flag = 1;
545 return GSW_HAL_SUCCESS;
546}
547
548/**
549 * @brief sms sdk deinit
550 * @param
551 * @retval 0: success
552 * @retval other: fail
553 */
554int gsw_sms_sdk_deinit(void)
555{
556 int ret = -1;
557
558 if(init_flag == 0)
559 {
560 return -1;
561 }
562
563 LOGD("callback clear\n");
564 gsw_sms_callback = NULL;
565
566 LOGD("handle_free\n");
567 if(sms_info_handle != NULL)
568 {
569 ret = mbtk_info_handle_free(&sms_info_handle);
570 if(ret != 0)
571 {
572 LOGE("[gsw_sms_sdk_deinit]mbtk_info_handle_free fail\n");
573 return GSW_HAL_FAIL;
574 }
575 sms_info_handle = NULL;
576 }
577
578 LOGD("dlclose start\n");
579 if(dlHandle_mbtk == NULL)
580 {
581 LOGE("[gsw_sms_sdk_deinit]dlHandle_sms is null\n");
582 }
583 else
584 {
585 dlclose(dlHandle_mbtk);
586 }
587 LOGD("dlclose end\n");
588 init_flag = 0;
589 return GSW_HAL_SUCCESS;
590}
591
592/**
593 * @brief send sms fuction *
594 * @param [in] phone_num dest phone num send sms
595 * @param [in] char_set encode format for sms 0 7bit 1 binary 2 usc2
596 * @param [in] msg sms content
597 * @param [in] msg_len send sms length,max is 1024
598 * @retval 0: success
599 * @retval other: fail
600 */
601int gsw_send_sms(char *phone_num, int char_set, char *msg, int msg_len)
602{
603
604 if(init_flag == 0)
605 {
606 return GSW_HAL_FAIL;
607 }
608
609 if(phone_num == NULL || msg == NULL)
610 {
611 return GSW_HAL_MEM_INVAILD;
612 }
613
614 if(strlen((char *)msg) > GSW_SMS_RECV_CONT_MAX || strlen((char *)msg) == 0 || strlen((char *)phone_num) == 0)
615 {
616 LOGE("strlen(telephony_num):%d", strlen((char *)phone_num));
617 LOGE("strlen(msg):%d", strlen((char *)msg));
618 return GSW_HAL_MEM_INVAILD;
619 }
620
621 int err = -1;
622
623 char smscPDU[30] = {0};
624 char **pdu = NULL;
625 char smsc[4] = {0};
626 char cmgs[MSM_NUMBER_MAX] = {0};
627 char resp[RES_NUM_MIN] = {0};
628 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
629
630 kal_int32 msg_num = 0;
631 kal_int32 pdu_msg_len = 0;
632 kal_int32 status = MDAPI_RET_ERROR;
633 kal_int32 index = 0;
634
635 if(char_set == 1) //8bit
636 {
637 ArrayToStr((unsigned char *)msg, (unsigned int)msg_len, msg_e_b);
638 status = _mdapi_sms_get_msg_num(msg_e_b, char_set, &msg_num, &pdu_msg_len);
639 }
640
641 else //7bit usc2
642 {
643 status = _mdapi_sms_get_msg_num((char *)msg, char_set, &msg_num, &pdu_msg_len);
644 }
645
646 LOGE("%s, %s, %d, msg_len = [%d] ,msg_num=[%d]\n", __FILE__, __FUNCTION__, __LINE__, msg_len, msg_num);
647 if(status == MDAPI_RET_ERROR)
648 {
649 LOGE("get message number failed\n");
650 //return GSW_HAL_FAIL;
651 }
652 else
653 {
654 //allocate memery for **pdu
655 pdu = (char **)malloc(sizeof(char *) * msg_num);
656 if(pdu == NULL)
657 {
658 LOGE("%s, %s, %d, allocate memory for pdu failed\n", __FILE__, __FUNCTION__, __LINE__);
659 return GSW_HAL_FAIL;
660 }
661
662 else
663 {
664 for(index = 0; index < msg_num; index++)
665 {
666 pdu[index] = (char *)malloc(sizeof(char)*MAX_PDU_SIZE);
667 if(pdu[index] == NULL)
668 {
669 for(int i = 0; i < index; i++)
670 {
671 free(pdu[i]);
672 pdu[i] = NULL;
673 }
674 free(pdu);
675 pdu = NULL;
676 LOGE("%s, %s, %d, allocate memory for pdu[%d] failed\n", __FILE__, __FUNCTION__, __LINE__,index);
677 return GSW_HAL_FAIL;
678 }
679 else
680 {
681 memset(pdu[index], 0, MAX_PDU_SIZE);
682 LOGE("%s, %s, %d, pdu[%d} init value is: %s \n", __FILE__, __FUNCTION__, __LINE__, index, pdu[index]);
683 }
684 }
685 }
686 }
687
688 //allocate memory for **pdu success
689 if(index == msg_num)
690 {
691 if(char_set == 1)//8bit
692 {
693 smsPduEncode(smsc, (char *)phone_num, msg_e_b, char_set, smscPDU, pdu);
694 }
695 else
696 {
697 smsPduEncode(smsc, (char *)phone_num, (char *)msg, char_set, smscPDU, pdu);
698 }
699 for(index = 0; index < msg_num; index++)
700 {
701 char pdu_data[MAX_PDU_SIZE] = {0};
702 char *p = pdu_data;
703
704 LOGE("index:%d\n",index);
705 LOGE("%s, %s, %d, smscPDU: %s, pdu: %s",__FILE__, __FUNCTION__, __LINE__, smscPDU, pdu[index]);
706 sprintf(p, "%s",smscPDU);
707 LOGE("pdu_data:%s\n", pdu_data);
708 int sc = strlen(pdu_data);
709 sprintf(p+strlen(p), "%s", pdu[index]);
710 LOGE("pdu_data:%s\n", pdu_data);
711
712 int t = strlen(pdu_data);
713 sprintf(cmgs, "%d,%s", (t-sc)/2, pdu_data);
714 LOGE("cmgs:%s\n", cmgs);
715 memset(resp, 0, sizeof(resp));
716
717 err = mbtk_sms_cmgf_set(sms_info_handle, 0);
718 if(err)
719 {
720 LOGE("cmgf set error : %d\n", err);
721 for(index = 0; index < msg_num; index++){
722 free(pdu[index]);
723 pdu[index] = NULL;
724 }
725 free(pdu);
726 pdu = NULL;
727 return GSW_HAL_FAIL;
728 }
729 else
730 {
731 LOGD("cmgf set success\n");
732 }
733
734 err = mbtk_sms_cmgs_set(sms_info_handle, cmgs, resp);
735 if(err)
736 {
737 LOGE("cmgs send fail\n");
738 for(index = 0; index < msg_num; index++){
739 free(pdu[index]);
740 pdu[index] = NULL;
741 }
742 free(pdu);
743 pdu = NULL;
744 return GSW_HAL_FAIL;
745 }
746 else
747 {
748 LOGD("cmgs send success, resp:%s\n", resp);
749 }
750
751 }
752 }
753
754 for(index = 0; index < msg_num; index++){
755 free(pdu[index]);
756 pdu[index] = NULL;
757 }
758 free(pdu);
759 pdu = NULL;
760
761 return GSW_HAL_SUCCESS;
762}
763
764
765/**
766 * @brief get smsc fuction *
767 * @param [in] len input buf len for smsc,max is 32
768 * @param [out] smsc address for smsc get from this func *
769 * @retval 0: success
770 * @retval other: fail
771 */
772int gsw_get_smsc_address(int len, char *smsc)
773{
774 int ret = -1;
775 int len_t = 0;
776 char smsc_temp[SMSC_MAX_LEN] = {0};
777 char *p1, *p2 ,*substr;
778
779 if(init_flag == 0)
780 {
781 return GSW_HAL_FAIL;
782 }
783
784 if(smsc == NULL || len <= 0)
785 {
786 LOGE("smsc is null or len = %d\n",len);
787 return GSW_HAL_MEM_INVAILD;
788 }
789
790 ret = mbtk_sms_csca_get(sms_info_handle, smsc_temp);
791 if(smsc_temp[0] == '\0')
792 {
793 LOGE("gsw_get_smsc_address Error : %d\n", ret);
794 return GSW_HAL_FAIL;
795 }
796
797 else
798 {
799 p1 = strchr(smsc_temp, '\"');
800 p2 = strrchr(smsc_temp, '\"');
801 if (p1 && p2 && p2 > p1)
802 {
803 len_t = p2 - p1 - 1;
804 char* substr_t = NULL;
805 substr_t = (char *)malloc(len_t + 1);
806 if(substr_t == NULL)
807 {
808 LOGE("malloc substr_t fail\n");
809 return GSW_HAL_MEM_INVAILD;
810 }
811 strncpy(substr_t, p1 + 1, len_t);
812 substr_t[len_t] = '\0';
813
814 substr = substr_t;
815
816 memcpy(smsc, substr, strlen(substr));
817 memcpy(sms_center_address, substr, strlen(substr));
818
819 LOGE("qser_sms_getsmscenteraddress success, smsc = %s\n", sms_center_address);
820 free(substr_t);
821 }
822 else
823 {
824 LOGE("String inside double quotes not found\n");
825 return GSW_HAL_FAIL;
826 }
827 }
828
829
830 return GSW_HAL_SUCCESS;
831}
832
833/**
834 * @brief set smsc fuction
835 * @param [out] smsc string value for smsc,max length is 32 *
836 * @retval 0: success
837 * @retval other: fail
838 */
839int gsw_set_smsc_address(const char *smsc)
840{
841 int ret = -1;
842
843 if(init_flag == 0)
844 {
845 return GSW_HAL_FAIL;
846 }
847
848 if(smsc == NULL || strlen((char *)smsc) == 0)
849 {
850 LOGE("smsc is null or empty\n");
851 return GSW_HAL_MEM_INVAILD;
852 }
853
854 ret = mbtk_sms_csca_set(sms_info_handle, (char *)smsc);
855
856 if(ret == 0)
857 {
858 LOGE("set smsc success,smsc = %s\n",smsc);
859 }
860 else
861 {
862 LOGE("set smsc fail,ret = %d\n", ret);
863 return GSW_HAL_FAIL;
864 }
865
866 return GSW_HAL_SUCCESS;
867}