public override object Execute(object arg, IAsyncTaskProgress progress) { SmsDataSource ds = null; try { var pi = PluginInfo as DataParsePluginInfo; ds = new SmsDataSource(pi.SaveDbPath); var smsdbPath = pi.SourcePath[0].Local; if (!FileHelper.IsValidDictory(smsdbPath)) { return(ds); } var smsdbFile = Path.Combine(smsdbPath, "mmssms.db"); if (!FileHelper.IsValid(smsdbFile)) { return(ds); } var contactsdbFile = Path.Combine(smsdbPath, "contacts2.db"); if (!FileHelper.IsValid(contactsdbFile)) { contactsdbFile = null; } var paser = new AndroidSmsDataParseCoreV1_0(smsdbFile, contactsdbFile); paser.BuildData(ds); } catch (System.Exception ex) { Framework.Log4NetService.LoggerManagerSingle.Instance.Error("提取安卓短信数据出错!", ex); } finally { ds?.BuildParent(); } return(ds); }
/// <summary> /// 解析数据 /// </summary> /// <param name="dataSource"></param> public void BuildData(SmsDataSource dataSource) { if (!FileHelper.IsValid(MainDbPath)) { return; } SqliteContext mainContext = null; string attendDirPath = MediaDomainPath; try { var rMainDbFile = SqliteRecoveryHelper.DataRecovery(MainDbPath, @"chalib\IOS_Sms\sms.db.charactor", "message,handle,attachment,chat,chat_message_join,chat_handle_join,message_attachment_join", true); mainContext = new SqliteContext(rMainDbFile); var handleDynamicList = mainContext.FindByName("handle"); var chathandlejoinDynamicList = mainContext.Find(new SQLiteString("SELECT chat_id,handle_id FROM chat_handle_join WHERE chat_id NOTNULL")).ToList(); var chatmessagejoinDynamicList = mainContext.Find(new SQLiteString("SELECT chat_id,message_id FROM chat_message_join WHERE chat_id NOTNULL")); var messageAttachmentJoinDynamicList = mainContext.Find(new SQLiteString("SELECT message_id,attachment_id FROM message_attachment_join WHERE message_id NOTNULL")).ToList(); var attachmentDynamicList = mainContext.FindByName("attachment"); var dateStr = ""; mainContext.UsingSafeConnection(new SQLiteString("select * from message order by date desc"), r => { dynamic smsObj; while (r.Read()) { smsObj = r.ToDynamic(); var sms = new SMS(); //短信内容 sms.Content = DynamicConvert.ToSafeString(smsObj.text); sms.Content = FragmentHelper.RemoveNullityDataNew(sms.Content); // 验证内容是否为空 if (FragmentHelper.IsEmptyString(sms.Content)) { continue; } sms.DataState = DynamicConvert.ToEnumByValue(smsObj.XLY_DataType, EnumDataState.Normal); //发送时间和读取时间。 dateStr = DynamicConvert.ToSafeString(smsObj.date); if (dateStr.Length > 9) { dateStr = dateStr.Substring(0, 9); } sms.StartDate = DynamicConvert.ToSafeDateTime(dateStr, 2001); //sms.ReadTime = DynamicConvert.ToSafeDateTime(smsObj.date_read, 2001); int smsId = DynamicConvert.ToSafeInt(smsObj.ROWID); sms.Remark = string.Empty; int hanldeId = DynamicConvert.ToSafeInt(smsObj.handle_id); if (hanldeId == 0) { //群发消息 var someChatMsgObj = chatmessagejoinDynamicList.FirstOrDefault(cmj => DynamicConvert.ToSafeInt(cmj.message_id) == smsId && DynamicConvert.ToSafeInt(cmj.chat_id) != 0); if (someChatMsgObj != null) { var handleIdList = chathandlejoinDynamicList.FindAll(chj => DynamicConvert.ToSafeInt(chj.chat_id) == someChatMsgObj.chat_id); var numbersBuilder = new StringBuilder(); foreach (var oneHandle in handleIdList) { numbersBuilder.Append(GetPhoteNumber(DynamicConvert.ToSafeInt(oneHandle.handle_id), handleDynamicList)); numbersBuilder.Append(";"); } sms.Remark = LanguageHelper.GetString(Languagekeys.PluginSMS_QunSend) + "; "; sms.Number = numbersBuilder.ToString().TrimEnd(";"); } } else { sms.Number = GetPhoteNumber(hanldeId, handleDynamicList); } if (sms.Number.IsValid() && sms.DataState == EnumDataState.Fragment) { if (!FragmentHelper.IsValidFragment(sms.Number)) { continue; } } //发送或者接收 sms.SmsState = DynamicConvert.ToSafeInt(smsObj.is_from_me) == 1 ? EnumSMSState.SendSMS : EnumSMSState.ReceiveSMS; int isDelivered = DynamicConvert.ToSafeInt(smsObj.is_delivered); int isSent = DynamicConvert.ToSafeInt(smsObj.is_sent); if (sms.SmsState == EnumSMSState.ReceiveSMS) { sms.Remark += DynamicConvert.ToSafeInt(smsObj.is_read) == 1 ? string.Format("{0};", LanguageHelper.GetString(Languagekeys.PluginSMS_IsRead)) : string.Format("{0};", LanguageHelper.GetString(Languagekeys.PluginSMS_NotRead)); } else { if (isDelivered == 0 && isSent == 0) { sms.Remark += LanguageHelper.GetString(Languagekeys.PluginSMS_SendFail) + "; "; } } #region 附件解析 int cache_has_attachments = DynamicConvert.ToSafeInt(smsObj.cache_has_attachments); if (cache_has_attachments == 1) { var attachmentIdList = messageAttachmentJoinDynamicList.FindAll(maj => DynamicConvert.ToSafeInt(maj.message_id) != 0 && DynamicConvert.ToSafeInt(maj.message_id) == smsId); sms.Remark += LanguageHelper.GetString(Languagekeys.PluginSMS_Attachment) + "; "; foreach (var oneAttachIdObj in attachmentIdList) { int attId = DynamicConvert.ToSafeInt(oneAttachIdObj.attachment_id); var attachObj = attachmentDynamicList.FirstOrDefault(att => DynamicConvert.ToSafeInt(att.ROWID) == attId); if (attachObj != null) { string attPath = DynamicConvert.ToSafeString(attachObj.filename); attPath = attPath.Replace('/', '\\').TrimStart('~'); sms.Remark += FileHelper.ConnectPath(attendDirPath, attPath) + ";"; } } } #endregion sms.Remark = sms.Remark.TrimEnd(";"); if (sms.Remark.Contains(LanguageHelper.GetString(Languagekeys.PluginSMS_NotRead))) { sms.ReadState = EnumReadState.Unread; } else { sms.ReadState = EnumReadState.Read; } if (sms.Number.IsInvalid() && sms.Content.IsInvalid()) { continue; } if (sms.Number.IsInvalid()) { var address = DataParseHelper.NumberToStu(DynamicConvert.ToSafeString(smsObj.address)); sms.Number = DynamicConvert.ToSafeString(address); } dataSource.Items.Add(sms); } }); } finally { mainContext?.Dispose(); mainContext = null; } }
/// <summary> /// 解析数据 /// </summary> /// <param name="datasource"></param> public void BuildData(SmsDataSource datasource) { if (!FileHelper.IsValid(MainDbPath)) { return; } SqliteContext mainContext = null; try { string charatorPath = MatchCharatorPath(); var rMainDbFile = SqliteRecoveryHelper.DataRecovery(MainDbPath, charatorPath, "sms", true); mainContext = new SqliteContext(rMainDbFile); string createSmsSql = string.Empty; var smssList = GetSmssList(mainContext, ref createSmsSql); if (smssList.IsInvalid()) { return; } var contactList = GetContactList(); SMS item; foreach (var sms in smssList) { try { item = new SMS(); item.Content = DynamicConvert.ToSafeString(sms.content); item.Content = FragmentHelper.RemoveNullityDataNew(item.Content); // 验证内容是否为空 if (FragmentHelper.IsEmptyString(item.Content)) { continue; } item.SmsState = DynamicConvert.ToEnumByValue <EnumSMSState>(sms.type, EnumSMSState.None); item.Number = DynamicConvert.ToSafeString(sms.number); item.Number = DataParseHelper.NumberToStu(item.Number); item.ContactName = DynamicConvert.ToSafeString(sms.name); if (item.ContactName.IsInvalid()) { // 关联获取联系人名称 item.ContactName = GetContactName(item.Number, contactList); } item.DataState = DynamicConvert.ToEnumByValue <EnumDataState>(sms.XLY_DataType, EnumDataState.Normal); if (DynamicConvert.ToSafeString(sms.deleted) == "1") { item.DataState = EnumDataState.Deleted; } item.StartDate = DynamicConvert.ToSafeDateTime(sms.date); item.ReadState = DynamicConvert.ToSafeInt(sms.read) == 0 ? EnumReadState.Unread : EnumReadState.Read; datasource.Items.Add(item); } catch { } } } finally { mainContext?.Dispose(); mainContext = null; } }