public override object Execute(object arg, IAsyncTaskProgress progress) { MMSDataSource ds = null; try { var pi = PluginInfo as DataParsePluginInfo; ds = new MMSDataSource(pi.SaveDbPath); var databasesFilePath = pi.SourcePath[0].Local; if (!FileHelper.IsValid(databasesFilePath)) { return(ds); } BuildData(ds, databasesFilePath); } catch (System.Exception ex) { Framework.Log4NetService.LoggerManagerSingle.Instance.Error("提取安卓彩信数据出错!", ex); } finally { ds?.BuildParent(); } return(ds); }
public override object Execute(object arg, IAsyncTaskProgress progress) { MMSDataSource ds = null; try { var pi = PluginInfo as DataParsePluginInfo; ds = new MMSDataSource(pi.SaveDbPath); var dbPath = pi.SourcePath[0].Local; if (!FileHelper.IsValidDictory(dbPath)) { return(ds); } var dbFile = Path.Combine(dbPath, "sms.db"); if (!FileHelper.IsValid(dbFile)) { return(ds); } var paser = new IOSMmsDataParseCoreV1_0(dbFile, pi.SourcePath[1].Local); paser.BuildData(ds); } catch (System.Exception ex) { Framework.Log4NetService.LoggerManagerSingle.Instance.Error("提取IOS彩信数据出错!", ex); } finally { ds?.BuildParent(); } return(ds); }
/// <summary> /// 解析数据 /// </summary> /// <param name="dataSource"></param> public void BuildData(MMSDataSource 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 messageSource = mainContext.Find(new SQLiteString("SELECT * FROM MESSAGE WHERE CACHE_HAS_ATTACHMENTS = 1 and ROWID not null")); var allContact = mainContext.FindByName("HANDLE"); foreach (var message in messageSource) { var sb = new StringBuilder( "select distinct atta.[filename],atta.[mime_type],atta.[created_date] from MESSAGE_ATTACHMENT_JOIN mes "); sb.Append("left join attachment atta on mes.attachment_id = atta.[ROWID] "); sb.AppendFormat("where mes.[message_id] = {0} and atta.filename not null", DynamicConvert.ToSafeString(message.ROWID)); var contact = allContact.First(cct => DynamicConvert.ToSafeInt(cct.ROWID) == DynamicConvert.ToSafeInt(message.handle_id)); var mms = new MMS(); mms.SenderName = DynamicConvert.ToSafeString(contact.uncanonicalized_id); mms.SendState = DynamicConvert.ToSafeInt(message.is_from_me) == 1 ? EnumSendState.Send : EnumSendState.Receive; mms.Date = DynamicConvert.ToSafeDateTime(message.date); mms.ReadDate = DynamicConvert.ToSafeDateTime(message.date_read); mms.Content = DynamicConvert.ToSafeString(message.text).TrimStart('?') + Environment.NewLine; // 获取当前消息的所有附件; var attaSource = mainContext.Find(new SQLiteString(sb.ToString())); foreach (var atta in attaSource) { if (FragmentHelper.IsValidFragment(atta)) { continue; } string attPath = DynamicConvert.ToSafeString(atta.filename).TrimStart('~').TrimStart('/').Replace("/", @"\"); mms.Content += string.Format("{0}{1}", Path.Combine(attendDirPath, attPath), Environment.NewLine); } mms.Content = FragmentHelper.RemoveNullityDataNew(mms.Content.Trim()); // 验证内容是否为空 if (FragmentHelper.IsEmptyString(mms.Content)) { continue; } dataSource.Items.Add(mms); } } finally { mainContext?.Dispose(); mainContext = null; } }
private void BuildData(MMSDataSource ds, string databasesFilePath) { var nfile = SqliteRecoveryHelper.DataRecovery(databasesFilePath, "", "canonical_addresses,pdu,part"); using (var sqliteContext = new SqliteContext(nfile)) { MMS item = null; // 获取所有彩信信息; List <dynamic> itemsMMS = sqliteContext.FindByName("pdu").ToList(); List <dynamic> itemsAddr = sqliteContext.FindByName("canonical_addresses").ToList(); List <dynamic> itemsPart = sqliteContext.Find(new SQLiteString("select * from part where ct not in ('application/smil')")).ToList(); foreach (var o in itemsMMS) { try { item = new MMS(); item.DataState = DynamicConvert.ToEnumByValue <EnumDataState>(o.XLY_DataType, EnumDataState.Normal); item.SendState = DynamicConvert.ToSafeInt(o.msg_box) == 1 ? EnumSendState.Receive : EnumSendState.Send; item.Date = DynamicConvert.ToSafeDateTime(o.date); // 获取彩信的扩展; var resultAddr = itemsAddr.Find(addr => DynamicConvert.ToSafeInt(addr.xly_id) == DynamicConvert.ToSafeInt(o.thread_id)); if (resultAddr == null) { continue; } item.SenderName = DataParseHelper.NumberToStu(DynamicConvert.ToSafeString(resultAddr.address)); // 内容扩展 var resultPart = itemsPart.FindAll(part => DynamicConvert.ToSafeInt(part.mid) == DynamicConvert.ToSafeInt(o.xly_id)); // 这段方法虽然看起来不爽,但是别删!有个别手机数据结构不同!这里主要兼容; wangxi 2014-7-14 17:14:05 if (string.IsNullOrEmpty(item.SenderName) && resultPart.Count != 0) { var num = itemsAddr.Find(addr => DynamicConvert.ToSafeInt(resultPart.First().xly_id) == DynamicConvert.ToSafeInt(addr.xly_id)); item.SenderName = DynamicConvert.ToSafeString(num.address); item.SenderName = DataParseHelper.NumberToStu(item.SenderName); } if (resultPart.Count == 0) { item.Content = DynamicConvert.ToSafeString(o.ct_l); item.Type = EnumColumnType.URL; } else { if (resultPart.Count == 1) { if (DynamicConvert.ToSafeString(resultPart.First().xly_data) != "") { item.Content = DynamicConvert.ToSafeString(resultPart.First().xly_data).TrimStart('/').Replace("/", @"\"); } else { item.Content = DynamicConvert.ToSafeString(resultPart.First().text); } } if (resultPart.Count > 1) { // 获取所有附加消息; var allMsg = resultPart.FindAll(part => DynamicConvert.ToSafeString(part.ct).Equals("text/plain")); var allPart = resultPart.FindAll(part => DynamicConvert.ToSafeString(part.text) == string.Empty); string message = string.Empty; foreach (var mess in allMsg) { message += string.Format("{0}{1}", mess.text, Environment.NewLine); } string parts = string.Empty; foreach (var part in allPart) { if (!string.IsNullOrEmpty(DynamicConvert.ToSafeString(part.xly_data))) { string npath = DynamicConvert.ToSafeString(part.xly_data); parts += string.Format("{0}{1}", npath, Environment.NewLine); } } item.Content = parts + message; } } item.Content = item.Content.Trim(); ds.Items.Add(item); } catch { } } } }