[Bugfix][T108][bug-view-1994]Add long-short message reassembly function

Only Configure: No
Affected branch: GSW_V1453
Affected module: sms
Is it affected on IC: only ASR
Self-test: yes
Doc Update: no

Change-Id: I6f7ce9b3fb1c4452f8cc429cdecc4298359464d6
diff --git a/mbtk/libgsw_lib/gsw_sms_interface.c b/mbtk/libgsw_lib/gsw_sms_interface.c
index ecb8229..70a85eb 100755
--- a/mbtk/libgsw_lib/gsw_sms_interface.c
+++ b/mbtk/libgsw_lib/gsw_sms_interface.c
@@ -114,6 +114,19 @@
 #define lib_mbtk_path "/lib/libmbtk_lib.so"
 #define lib_qser_sms_path "/lib/liblynq-qser-sms.so"
 
+// 短信分片管理器结构体
+typedef struct {
+    char msg_id[64];           // 短信唯一标识(号码+日期)
+    int total_segments;        // 总分片数
+    int received_count;        // 已接收分片数
+    char** segments;           // 分片内容数组
+    time_t last_received;      // 最后接收时间
+} SmsReassembler;
+
+#define MAX_SMS_REASSEMBLERS 10  // 最大同时处理的短信数量
+#define MAX_SEGMENTS 255         // 最大分片数
+#define SMS_TIMEOUT 300          // 5分钟超时(秒)
+static SmsReassembler g_sms_reassemblers[MAX_SMS_REASSEMBLERS] = {0};
 
 static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
 int (*mbtk_sms_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
@@ -271,6 +284,102 @@
 
 }
 
+static void generate_sms_id(char* dest, const char* num, const char* date) {
+    snprintf(dest, 64, "%.30s_%.30s", num, date);
+}
+
+// 查找或创建短信重组器
+static SmsReassembler* get_sms_reassembler(const char* num, const char* date, int total_segments)
+{
+    char msg_id[64];
+    generate_sms_id(msg_id, num, date);
+    
+    time_t current_time = time(NULL);
+    
+    for (int i = 0; i < MAX_SMS_REASSEMBLERS; i++)
+    {
+        if (g_sms_reassemblers[i].msg_id[0] != '\0')
+        {
+            // 检查超时
+            if (current_time - g_sms_reassemblers[i].last_received > SMS_TIMEOUT)
+            {
+                // 清理超时重组器
+                for (int j = 0; j < g_sms_reassemblers[i].total_segments; j++)
+                {
+                    if (g_sms_reassemblers[i].segments[j])
+                    {
+                        free(g_sms_reassemblers[i].segments[j]);
+                    }
+                }
+                free(g_sms_reassemblers[i].segments);
+                memset(&g_sms_reassemblers[i], 0, sizeof(SmsReassembler));
+            }
+            else if (strcmp(g_sms_reassemblers[i].msg_id, msg_id) == 0)
+            {
+                g_sms_reassemblers[i].last_received = current_time;
+                return &g_sms_reassemblers[i];
+            }
+        }
+    }
+    
+    // 创建新的重组器
+    for (int i = 0; i < MAX_SMS_REASSEMBLERS; i++)
+    {
+        if (g_sms_reassemblers[i].msg_id[0] == '\0')
+        {
+            strncpy(g_sms_reassemblers[i].msg_id, msg_id, sizeof(g_sms_reassemblers[i].msg_id) - 1);
+            g_sms_reassemblers[i].total_segments = total_segments;
+            g_sms_reassemblers[i].received_count = 0;
+            g_sms_reassemblers[i].last_received = current_time;
+            
+            // 分配分片数组内存
+            g_sms_reassemblers[i].segments = calloc(total_segments, sizeof(char*));
+            if (!g_sms_reassemblers[i].segments)
+            {
+                LOGE(GSW_SMS, "Memory allocation failed for segments array");
+                memset(&g_sms_reassemblers[i], 0, sizeof(SmsReassembler));
+                return NULL;
+            }
+            
+            return &g_sms_reassemblers[i];
+        }
+    }
+    
+    LOGE(GSW_SMS, "No free slots for new SMS reassembler");
+    return NULL;
+}
+
+// 重组短信
+static char* reassemble_sms(SmsReassembler* reassembler)
+{
+    size_t total_len = 0;
+    for (int i = 0; i < reassembler->total_segments; i++)
+    {
+        if (reassembler->segments[i])
+        {
+            total_len += strlen(reassembler->segments[i]);
+        }
+    }
+    
+    char* full_msg = malloc(total_len + 1);
+    if (!full_msg)
+    {
+        LOGE(GSW_SMS, "Memory allocation failed for full message");
+        return NULL;
+    }
+    
+    full_msg[0] = '\0';
+    for (int i = 0; i < reassembler->total_segments; i++)
+    {
+        if (reassembler->segments[i])
+        {
+            strcat(full_msg, reassembler->segments[i]);
+        }
+    }
+    
+    return full_msg;
+}
+
 void ArrayToStr(unsigned char *Buff, unsigned int BuffLen, char *OutputStr)
 {
     int i = 0;
@@ -286,7 +395,8 @@
     return;
 }
 
-void gsw_sms_state_change_cb(const void* data, int data_len) {
+void gsw_sms_state_change_cb(const void* data, int data_len)
+{
     LOGD(GSW_SMS,"gsw_sms_state_change_cb -------start\n");
 
     uint8 *ptr = (uint8*)data;
@@ -352,21 +462,74 @@
     LOGE(GSW_SMS,"Second: %s\n", (char*)gsw_sms_date.seconds);
 
     gsw_sms_msg.date = gsw_sms_date;
+    
 
     if(gsw_sms_callback)
     {
-        // if(total_pack > 1 && curr_pack < total_pack)
-        // {
-            gsw_sms_callback(GSW_SMS_RECEIVED_FLG, &gsw_sms_msg);
-            LOGD(GSW_SMS,"the gsw_sms_state_e is %d\n",GSW_SMS_RECEIVED_FLG);
-        // }
-        // else
-        // {
-        //     gsw_sms_callback(GSW_SMS_FULL_FLG, &gsw_sms_msg);
-        // }
-        
+        if(total_pack > 1)
+        {
+            SmsReassembler* reassembler = get_sms_reassembler(num, date, total_pack);
+            if (!reassembler)
+            {
+                LOGE(GSW_SMS, "Failed to get SMS reassembler");
+                return;
+            }
+            int seg_index = curr_pack - 1;
+    
+            // 如果该分片尚未接收
+            if (!reassembler->segments[seg_index])
+            {
+                reassembler->segments[seg_index] = strdup(msg);
+                if (!reassembler->segments[seg_index])
+                {
+                    LOGE(GSW_SMS, "Memory allocation failed for segment content");
+                    return;
+                }
+                reassembler->received_count++;
+            }
+    
+            // 检查是否所有分片都已接收
+            if (reassembler->received_count == reassembler->total_segments)
+            {
+                char* full_msg = reassemble_sms(reassembler);
+                if (full_msg)
+                {
+                    
+                    gsw_sms_msg.content_encode = charset;
+                    strncpy(gsw_sms_msg.src_num, num, sizeof(gsw_sms_msg.src_num) - 1);
+                    gsw_sms_msg.content_len = strlen(full_msg);
+                    
+                    size_t copy_size = (gsw_sms_msg.content_len < sizeof(gsw_sms_msg.content)) ? 
+                                    gsw_sms_msg.content_len : sizeof(gsw_sms_msg.content) - 1;
+                    strncpy(gsw_sms_msg.content, full_msg, copy_size);
+                    gsw_sms_msg.content[copy_size] = '\0';
+                    
+                    snprintf((char *)gsw_sms_date.timezone, sizeof(gsw_sms_date.timezone), "%s", "+8");
+                    
+                    if (gsw_sms_callback)
+                        gsw_sms_callback(GSW_SMS_FULL_FLG, &gsw_sms_msg);
+                    
+                    free(full_msg);
+                }
+                
+                for (int i = 0; i < reassembler->total_segments; i++)
+                {
+                    if (reassembler->segments[i])
+                    {
+                        free(reassembler->segments[i]);
+                        reassembler->segments[i] = NULL;
+                    }
+                }
+                free(reassembler->segments);
+                reassembler->segments = NULL;
+                reassembler->received_count = 0;
+                reassembler->total_segments = 0;
+                memset(reassembler->msg_id, 0, sizeof(reassembler->msg_id));
+            }
+        }
+        else
+            gsw_sms_callback(GSW_SMS_FULL_FLG, &gsw_sms_msg);
     }
-
 }