private IEnumerable <History> GetHistroies(string databaseFile) { var histroies = new List <History>(); if (string.IsNullOrEmpty(databaseFile)) { return(histroies); } string copyfiles = SqliteRecoveryHelper.DataRecovery(databaseFile, @"chalib\Android_QQBrowse_V5.1.0.780\database.charactor", "history"); var context = new SqliteContext(copyfiles); try { var objList = context.FindByName("history"); if (objList != null) { foreach (dynamic source in objList) { History history = new History(); history.DataState = DynamicConvert.ToEnumByValue(source.XLY_DataType, EnumDataState.Normal); history.Name = DynamicConvert.ToSafeString(source.NAME); history.Url = DynamicConvert.ToSafeString(source.URL); history.VisitTime = DynamicConvert.ToSafeDateTime(source.DATETIME); histroies.Add(history); } } } catch { } return(histroies); }
/// <summary> /// 构造历史搜索节点 /// </summary> private void CreateHistorySearch(string databasesPath, TreeNode searchNode) { try { TreeNode addSearchNode = new TreeNode() { Text = "地点搜索", Type = typeof(TencentMapSearchAddress), Items = new DataItems <TencentMapSearchAddress>(DbFilePath) }; TreeNode addLineSearchNode = new TreeNode() { Text = "路线搜索", Type = typeof(TencentMapSearchRoute), Items = new DataItems <TencentMapSearchRoute>(DbFilePath) }; searchNode.TreeNodes.Add(addSearchNode); searchNode.TreeNodes.Add(addLineSearchNode); string dbFile = Path.Combine(databasesPath, "search_history.db"); if (!File.Exists(dbFile)) { return; } var newDb = SqliteRecoveryHelper.DataRecovery(dbFile, "", "search_history_tab"); CreateAddSearchTreeNode(newDb, addSearchNode); CreateAddlineSearchTreeNode(newDb, addLineSearchNode); } catch { } }
/// <summary> /// 获取数据库 /// </summary> private void GetSqliteContext() { string sourceDbPath = Path.Combine(MD5AccountPath, "DB", "MM.sqlite"); var recoveryDb = SqliteRecoveryHelper.DataRecovery(sourceDbPath, @"chalib\IOS_TencentWeiXin_V5.3\MM.sqlite.charactor", RecoveryTables(sourceDbPath), true); MainContext = new SqliteContext(recoveryDb); string sourceFtsPath = Path.Combine(MD5AccountPath, "fts", "fts_message.db"); if (File.Exists(sourceFtsPath)) { try { Dictionary <string, string> dicIndex = new Dictionary <string, string>(); dicIndex.Add("fts_username_id", "UsrName"); FtsContext = new SqliteContext(SqliteRecoveryHelper.DataRecovery( sourceFtsPath, @"chalib\IOS_TencentWeiXin_V5.3\fts_message.db.charactor", _ftsMsgTables + ",fts_username_id", "", "", true, dicIndex)); FtsContext.MergeTables(_ftsMsgTables, _ftsMsgNewTable, "IndexNameId", "c0usernameid"); } catch { FtsContext = null; } } }
/// <summary> /// 解析数据 /// </summary> /// <param name="datasource"></param> public void BuildData(CallDataSource datasource) { if (!FileHelper.IsValid(MainDbPath)) { return; } SqliteContext mainContext = null; try { //主数据库对象 var mainDbPath = SqliteRecoveryHelper.DataRecovery(MainDbPath, @"chalib\IOS_Call\call_history.db.charactor", "call", true); mainContext = new SqliteContext(mainDbPath); mainContext.UsingSafeConnection("SELECT * FROM call", r => { Call call; dynamic callObj; while (r.Read()) { callObj = r.ToDynamic(); call = new Call(); call.DataState = DynamicConvert.ToEnumByValue(callObj.XLY_DataType, EnumDataState.Normal); call.Number = DataParseHelper.NumberToStu(DynamicConvert.ToSafeString(callObj.address)); // 号码过滤,验证号码长度 if (!DataParseHelper.ValidateNumber(call.Number)) { continue; } call.DurationSecond = DynamicConvert.ToSafeInt(callObj.duration); call.StartDate = DynamicConvert.ToSafeDateTime(callObj.date); call.Type = GetCallStatus(DynamicConvert.ToSafeInt(callObj.flags), call.DurationSecond); datasource.Items.Add(call); } }); } finally { mainContext?.Dispose(); mainContext = null; } }
/// <summary> /// 构造同行信息节点 /// </summary> private void CreateTongxing(string filesPath, TreeNode searchNode) { try { var dbs = Directory.GetFiles(filesPath, "*.msgstore").Where(f => System.Text.RegularExpressions.Regex.IsMatch(f, @"\d+_v4.msgstore")); if (dbs.IsInvalid()) { return; } foreach (var msgstore in dbs) { var newDbFile = SqliteRecoveryHelper.DataRecovery(msgstore, "", "message"); string userid = System.Text.RegularExpressions.Regex.Match(msgstore, @"(\d+)_v4.msgstore").Groups[1].Value; IEnumerable <dynamic> msgs = null; using (SqliteContext context = new SqliteContext(newDbFile)) { msgs = context.Find(new SQLiteString("SELECT sid,time,sender,content,XLY_DataType FROM message WHERE sender != '@TIM#SYSTEM' ORDER BY time")); } if (msgs.IsInvalid()) { continue; } TreeNode msgNode = new TreeNode() { Text = userid, Type = typeof(TencentMapTongxingMsg), Items = new DataItems <TencentMapTongxingMsg>(DbFilePath) }; foreach (var msg in msgs) { var res = ToTencentMapTongxingMsg(msg); if (null != res) { msgNode.Items.Add(res); } } searchNode.TreeNodes.Add(msgNode); } } catch { } }
/// <summary> /// 解析数据 /// </summary> /// <param name="datasource"></param> public void BuildData(CallDataSource datasource) { SqliteContext mainContext = null; SqliteContext callsContext = null; try { List <dynamic> list = new List <dynamic>(); if (FileHelper.IsValid(MainDbPath)) { var rMainDbFile = SqliteRecoveryHelper.DataRecovery(MainDbPath, @"chalib\com.android.providers.contacts\contacts2.db.charactor", "calls", true); mainContext = new SqliteContext(rMainDbFile); var ls = mainContext.Find("SELECT * FROM calls"); if (ls.IsValid()) { list.AddRange(ls); } } if (FileHelper.IsValid(CallsDbPath)) { var rMainDbFile = SqliteRecoveryHelper.DataRecovery(CallsDbPath, @"chalib\com.android.providers.contacts\contacts2.db.charactor", "calls", true); callsContext = new SqliteContext(rMainDbFile); var ls = callsContext.Find("SELECT * FROM calls"); if (ls.IsValid()) { list.AddRange(ls); } } var items = new List <Call>(); TryParseCall(items, list); foreach (var item in items) { datasource.Items.Add(item); } } finally { mainContext?.Dispose(); callsContext?.Dispose(); mainContext = null; callsContext = null; } }
public void TestDataRecovery() { var MainDbPath = @"D:\test\contacts2.db"; var t1 = Task.Run(() => { SqliteRecoveryHelper.DataRecovery(MainDbPath, @"chalib\com.android.providers.contacts\contacts2.db.charactor", "calls", true); }); var t2 = Task.Run(() => { SqliteRecoveryHelper.DataRecovery(MainDbPath, @"chalib\com.android.providers.contacts\contacts2.db.charactor", "calls", true); }); Task.WaitAll(t1, t2); }
/// <summary> /// 解析数据 /// </summary> /// <param name="datasource"></param> public void BuildData(ContactDataSource datasource) { if (!FileHelper.IsValid(MainDbPath)) { return; } SqliteContext mainContext = null; try { var rMainDbFile = SqliteRecoveryHelper.DataRecovery(MainDbPath, @"chalib\com.android.providers.contacts\contacts2.db.charactor", "raw_contacts,contacts,phone_lookup,data,mimetypes,groups", true); mainContext = new SqliteContext(rMainDbFile); // raw_contacts表数据集合 var contactList = mainContext.Find(_SelectRawContactsSql); // phone_lookup表数据集合 var phoneLookupList = mainContext.Find("SELECT * FROM phone_lookup"); // dataView视图数据集合 var dataViewList = mainContext.Find(_SelectDataViewSql); // 群组列表 var groupList = mainContext.Find("SELECT * FROM groups"); // 联系人解析 var items = new List <Contact>(); if (contactList.IsValid()) { items = TryParseItems(contactList); TryParsePhoneLookup(items, phoneLookupList); TryParseDataView(items, dataViewList, groupList); } foreach (var item in items.Where(c => c.Number.IsValid())) { datasource.Items.Add(item); } } finally { mainContext?.Dispose(); mainContext = null; } }
private IEnumerable <dynamic> GetContactList() { if (!FileHelper.IsValid(ContactDbPath)) { return(new List <dynamic>()); } var nfile = SqliteRecoveryHelper.DataRecovery(ContactDbPath, @"chalib\com.android.providers.contacts\contacts2.db.charactor", "data,mimetypes", true); var context = new SqliteContext(nfile); string sqlStr = "select A.mimetype_id,A.raw_contact_id,A.data1,A.data4,substr(B.[mimetype],25,length(B.[mimetype])-24) as mimetype from data as A left outer join mimetypes as B on A.[mimetype_id] = B.[_id]"; var res = context.Find(new SQLiteString(sqlStr)); if (null != context) { context.Dispose(); } return(res); }
public void SqliteRecoveryHelperTest3() { int a = 0, b = 0; ThreadPool.QueueUserWorkItem((o) => { SqliteRecoveryHelper.DataRecovery(@"D:\111\test.db", "", "rcontact,message,userinfo2", "", ""); a = 1; }); ThreadPool.QueueUserWorkItem((o) => { SqliteRecoveryHelper.DataRecovery(@"D:\111\test1.db", "", "rcontact,message,userinfo2", "", ""); b = 1; }); while (a != 1 || b != 1) { Thread.Sleep(1000); } }
private IEnumerable <BookMark> GetBookmarks(string default_userFile) { var bookmarks = new List <BookMark>(); if (string.IsNullOrEmpty(default_userFile)) { return(bookmarks); } var copyFiles = SqliteRecoveryHelper.DataRecovery(default_userFile, @"chalib\Andorid_QQBrowse_V5.1.0.780\default_user.charactor", "mtt_bookmarks"); var context = new SqliteContext(copyFiles); try { var objList = context.FindByName("mtt_bookmarks"); if (objList != null) { foreach (dynamic source in objList) { string url = DynamicConvert.ToSafeString(source.url); if (!url.IsNullOrEmpty()) { var mark = new BookMark(); mark.DataState = DynamicConvert.ToEnumByValue(source.XLY_DataType, EnumDataState.Normal); mark.Title = DynamicConvert.ToSafeString(source.title); mark.Url = url; mark.IsDeleted = (int)DynamicConvert.ToSafeInt(source.deleted) == 0 ? "正常" : "已删除"; mark.CreatedTime = DynamicConvert.ToSafeDateTime(source.created); bookmarks.Add(mark); } } } } catch { } return(bookmarks); }
private IEnumerable <BookMark> GetBookmarks(string browser2File) { //data/data/com.android.browser/databases/browser2.db var bookmarks = new List <BookMark>(); if (string.IsNullOrEmpty(browser2File)) { return(bookmarks); } string copyfiles = SqliteRecoveryHelper.DataRecovery(browser2File, @"chalib\Android_LocalBrowse\browser2.charactor", "bookmarks"); var context = new SqliteContext(copyfiles); try { var objList = context.FindByName("bookmarks"); if (objList != null) { foreach (dynamic source in objList) { string url = DynamicConvert.ToSafeString(source.url); if (!url.IsNullOrEmpty()) { var book = new BookMark(); book.DataState = DynamicConvert.ToEnumByValue(source.XLY_DataType, EnumDataState.Normal); book.Title = DynamicConvert.ToSafeString(source.title); book.Url = url; book.CreatedTime = DynamicConvert.ToSafeDateTime(source.created); book.IsDeleted = DynamicConvert.ToSafeInt(source.deleted) == 0 ? "正常" : "已删除"; bookmarks.Add(book); } } } } catch { } return(bookmarks); }
private List <Calendar> GetCalendars(string CalendarDbFile) { List <Calendar> list = new List <Calendar>(); if (!FileHelper.IsValid(CalendarDbFile)) { return(list); } string newfile = SqliteRecoveryHelper.DataRecovery(CalendarDbFile, "", "Events"); using (var dataContext = new SqliteContext(newfile)) { var tempEvents = dataContext.FindByName("Events"); tempEvents.ForEach(s => { try { var calendar = new Calendar(); calendar.DataState = DynamicConvert.ToEnumByValue(s.XLY_DataType, EnumDataState.Normal); calendar.Title = DynamicConvert.ToSafeString(s.title); calendar.EventLocation = DynamicConvert.ToSafeString(s.eventLocation); calendar.Description = DynamicConvert.ToSafeString(s.description); calendar.DtStart = DynamicConvert.ToSafeDateTime(s.dtstart); calendar.DtEnd = DynamicConvert.ToSafeDateTime(s.dtend); calendar.Duration = DynamicConvert.ToSafeString(s.duration); list.Add(calendar); } catch (Exception ex) { Framework.Log4NetService.LoggerManagerSingle.Instance.Error("提取日历信息出错!", ex); } }); } return(list); }
private IEnumerable <WebCache> GetWebCaches(string webviewCache_x5File) { var qqcWebCache = new List <WebCache>(); if (string.IsNullOrEmpty(webviewCache_x5File)) { return(qqcWebCache); } var copyFiles = SqliteRecoveryHelper.DataRecovery(webviewCache_x5File, @"chalib\Andorid_QQBrowse_V5.1.0.780\webviewCache_x5.db.charactor", "cache"); var context = new SqliteContext(copyFiles); try { var objList = context.FindByName("cache"); if (objList != null) { foreach (dynamic source in objList) { var cache = new WebCache(); cache.DataState = DynamicConvert.ToEnumByValue(source.XLY_DataType, EnumDataState.Normal); cache.Url = DynamicConvert.ToSafeString(source.url); cache.ExpresTime = DynamicConvert.ToSafeDateTime(source.expires); cache.MimeType = DynamicConvert.ToSafeString(source.mimetype); cache.Encoding = DynamicConvert.ToSafeString(source.encoding); cache.HttpSatus = DynamicConvert.ToSafeInt(source.httpstatus); cache.Contentlength = DynamicConvert.ToSafeString(source.contentlength); qqcWebCache.Add(cache); } } } catch { } return(qqcWebCache); }
private IEnumerable <WebCookie> GetWebCookies(string webviewCookiesChromiumFile) { //data/data/com.android.browser/databases/webviewCookiesChromium.db var localWebCookie = new List <WebCookie>(); if (string.IsNullOrEmpty(webviewCookiesChromiumFile)) { return(localWebCookie); } string copyfiles = SqliteRecoveryHelper.DataRecovery(webviewCookiesChromiumFile, @"chalib\Android_LocalBrowse\webviewCookiesChromium.charactor", "cookies"); var context = new SqliteContext(copyfiles); try { var objList = context.FindByName("cookies"); if (objList != null) { foreach (dynamic source in objList) { var cookie = new WebCookie(); cookie.DataState = DynamicConvert.ToEnumByValue(source.XLY_DataType, EnumDataState.Normal); cookie.Name = DynamicConvert.ToSafeString(source.name); cookie.Value = DynamicConvert.ToSafeString(source.value); cookie.Domain = DynamicConvert.ToSafeString(source.host_key); cookie.ExpresTime = DynamicConvert.ToSafeDateTime(source.expires_utc); localWebCookie.Add(cookie); } } } catch { } return(localWebCookie); }
private List <Call> GetFromLog() { SqliteContext context = null; try { var items = new List <Call>(); if (!FileHelper.IsValid(MainDbPath)) { return(items); } var newFile = SqliteRecoveryHelper.DataRecovery(MainDbPath, @"chalib\com.android.providers.telephony\logs.db.charactor", "logs", true); // 处理新文件 context = new SqliteContext(newFile); var calls = context.Find(new SQLiteString("select * from logs where logtype=100 or logtype=256")); if (calls.IsInvalid()) { return(items); } TryParseCall(items, calls); return(items); } catch { return(new List <Call>()); } finally { if (null != context) { context.Dispose(); } } }
private List <Call> GetFromDefault() { SqliteContext context = null; try { var items = new List <Call>(); var file = ContactDbPath; if (!FileHelper.IsValid(file)) { return(new List <Call>()); } var newFile = SqliteRecoveryHelper.DataRecovery(file, @"chalib\com.android.providers.contacts\contacts2.db.charactor", "calls", true); // 处理新文件 context = new SqliteContext(newFile); var calls = context.FindByName("calls"); if (calls.IsInvalid()) { return(items); } TryParseCallDeafult(items, calls); return(items); } catch { return(new List <Call>()); } finally { if (null != context) { context.Dispose(); } } }
private IEnumerable <WebSitPassword> GetSitePwds(string webviewFile) { //data/data/com.android.browser/databases/webview.db var localSitePwd = new List <WebSitPassword>(); if (string.IsNullOrEmpty(webviewFile)) { return(localSitePwd); } string copyfiles = SqliteRecoveryHelper.DataRecovery(webviewFile, @"chalib\Android_LocalBrowse\webview.charactor", "password"); var context = new SqliteContext(copyfiles); try { var objList = context.FindByName("password"); if (objList != null) { foreach (dynamic source in objList) { var pwd = new WebSitPassword(); pwd.DataState = DynamicConvert.ToEnumByValue(source.XLY_DataType, EnumDataState.Normal); pwd.Host = DynamicConvert.ToSafeString(source.host); pwd.UserName = DynamicConvert.ToSafeString(source.username); pwd.Password = DynamicConvert.ToSafeString(source.password); localSitePwd.Add(pwd); } } } catch { } return(localSitePwd); }
private IEnumerable <History> GetHistroies(string browser2File) { //data/data/com.android.browser/databases/browser2.db var histroies = new List <History>(); if (string.IsNullOrEmpty(browser2File)) { return(histroies); } string copyfiles = SqliteRecoveryHelper.DataRecovery(browser2File, @"chalib\Android_LocalBrowse\browser2.charactor", "history"); var sqliteContext = new SqliteContext(copyfiles); try { var objList = sqliteContext.FindByName("history"); if (objList != null) { foreach (dynamic source in objList) { var history = new History(); history.DataState = DynamicConvert.ToEnumByValue(source.XLY_DataType, EnumDataState.Normal); history.Name = DynamicConvert.ToSafeString(source.title); history.Url = DynamicConvert.ToSafeString(source.url); history.VisitTime = DynamicConvert.ToSafeDateTime(source.date); history.Visits = DynamicConvert.ToSafeString(source.visits); histroies.Add(history); } } } catch { } return(histroies); }
private IEnumerable <WebCookie> GetWebCookies(string webview_x5File) { var localWebCookie = new List <WebCookie>(); if (string.IsNullOrEmpty(webview_x5File)) { return(localWebCookie); } var copyFiles = SqliteRecoveryHelper.DataRecovery(webview_x5File, @"chalib\Andorid_QQBrowse_V5.1.0.780\webview_x5.db.charactor", "cookies"); var context = new SqliteContext(copyFiles); try { var objList = context.FindByName("cookies"); if (objList != null) { foreach (dynamic source in objList) { var cookie = new WebCookie(); cookie.DataState = DynamicConvert.ToEnumByValue(source.XLY_DataType, EnumDataState.Normal); cookie.Name = DynamicConvert.ToSafeString(source.name); cookie.Value = DynamicConvert.ToSafeString(source.value); cookie.Domain = DynamicConvert.ToSafeString(source.domain); cookie.ExpresTime = DynamicConvert.ToSafeDateTime(source.expires); localWebCookie.Add(cookie); } } } catch { } return(localWebCookie); }
/// <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; } }
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 { } } } }
public void SqliteRecoveryHelperTest2() { SqliteRecoveryHelper.DataRecovery(@"D:\111\test1.db", "", "rcontact,message,userinfo2", "", ""); }
private void BuildData(TreeDataSource datasource, string dbfilePath, string databasesPath, string user_infoFilePath) { var doc = new XmlDocument(); string[] allUserInfoLines = File.ReadAllLines(user_infoFilePath, Encoding.UTF8); var userContent = allUserInfoLines.ToList(); var xmlContent = new StringBuilder(); foreach (var content in userContent) { xmlContent.Append(content); } doc.LoadXml(xmlContent.ToString()); XmlNodeList userInfoNodeList = doc.SelectNodes("map//int[@value='1']"); if (userInfoNodeList == null || userInfoNodeList.Count == 0) { return; } var accountsDbNames = new List <string>(); foreach (XmlElement n in userInfoNodeList) { string userNameResource = n.Attributes["name"].Value; if (userNameResource.Contains("newmailnotification")) { var qqNumber = userNameResource.Substring("newmailnotification".Length); accountsDbNames.Add(qqNumber); } } foreach (var currDbName in accountsDbNames) { var sendTree = new TreeNode(); sendTree.Text = "发件箱"; sendTree.Type = typeof(EmailInfo); sendTree.Items = new DataItems <EmailInfo>(dbfilePath); var receiveTree = new TreeNode(); receiveTree.Text = "收件箱"; receiveTree.Type = typeof(EmailInfo); receiveTree.Items = new DataItems <EmailInfo>(dbfilePath); var draftsTree = new TreeNode(); draftsTree.Text = "草稿箱"; draftsTree.Type = typeof(EmailInfo); draftsTree.Items = new DataItems <EmailInfo>(dbfilePath); var deleteTree = new TreeNode(); deleteTree.Text = "删除邮件"; deleteTree.Type = typeof(EmailInfo); deleteTree.Items = new DataItems <EmailInfo>(dbfilePath); var accountTree = new TreeNode(); accountTree.Type = typeof(EmailAccount); accountTree.Items = new DataItems <EmailAccount>(dbfilePath); accountTree.Text = currDbName + "@qq.com"; accountTree.TreeNodes.Add(sendTree); accountTree.TreeNodes.Add(receiveTree); accountTree.TreeNodes.Add(draftsTree); accountTree.TreeNodes.Add(deleteTree); string dbName = "QMDatabase" + currDbName; var account = new EmailAccount(); account.Nick = currDbName; account.EmailAddress = accountTree.Text; accountTree.Items.Add(account); var file = Path.Combine(databasesPath, dbName); var nfile = SqliteRecoveryHelper.DataRecovery(file, @"\\chalib\Andriod_Tencent.mail_V2.0.4\QMDatabase1684333193.charactor", "mail"); var context = new SqliteContext(nfile); var qqEmailObject = context.FindByName("mail"); foreach (var source in qqEmailObject) { var email = new EmailInfo(); email.Receiver = FormatQqEmailAccountDispaly(DynamicConvert.ToSafeString(source.receiverforsearch)); email.Sender = FormatQqEmailAccountDispaly(DynamicConvert.ToSafeString(source.senderforsearch)); email.Subject = DynamicConvert.ToSafeString(source.subject); email.TextContent = DynamicConvert.ToSafeString(source.abstractcontent); email.StartDate = DynamicConvert.ToSafeDateTime(source.date); email.RecvDataTime = DynamicConvert.ToSafeDateTime(source.date); email.DataState = DynamicConvert.ToEnumByValue <EnumDataState>(source.XLY_DataType, EnumDataState.Normal); switch (DynamicConvert.ToSafeString(source.folderid)) { case "3": sendTree.Items.Add(email); break; case "4": draftsTree.Items.Add(email); break; case "5": deleteTree.Items.Add(email); break; default: receiveTree.Items.Add(email); break; } } datasource.TreeNodes.Add(accountTree); } }
/// <summary> /// 构造收藏信息节点 /// </summary> private void CreateFavoriteSearch(string databasesPath, TreeNode searchNode) { try { string dbFile = Path.Combine(databasesPath, "favorite.db"); if (!File.Exists(dbFile)) { return; } dbFile = SqliteRecoveryHelper.DataRecovery(dbFile, "", "FavoritePOIEntity,FavoriteRouteEntity,FavoriteStreetEntity"); IEnumerable <dynamic> addrNodeDatas = null; IEnumerable <dynamic> routeNodeDatas = null; IEnumerable <dynamic> streetNodeDatas = null; TreeNode addrNode = new TreeNode() { Text = "收藏地点", Type = typeof(TencentMapFavoriteAddr), Items = new DataItems <TencentMapFavoriteAddr>(DbFilePath) }; TreeNode routeNode = new TreeNode() { Text = "收藏路线", Type = typeof(TencentMapFavoriteRoute), Items = new DataItems <TencentMapFavoriteRoute>(DbFilePath) }; TreeNode streetNode = new TreeNode() { Text = "收藏街景", Type = typeof(TencentMapFavoriteStreet), Items = new DataItems <TencentMapFavoriteStreet>(DbFilePath) }; searchNode.TreeNodes.Add(addrNode); searchNode.TreeNodes.Add(routeNode); searchNode.TreeNodes.Add(streetNode); //收藏地点 using (var context = new SqliteContext(dbFile)) { addrNodeDatas = context.Find(new SQLiteString("SELECT creatTime,name,obj,XLY_DataType FROM FavoritePOIEntity ORDER BY creatTime DESC")); } foreach (var data in addrNodeDatas) { var addr = ToTencentMapFavoriteAddr(data); if (null != addr) { addrNode.Items.Add(addr); } } //收藏路线 using (var context = new SqliteContext(dbFile)) { routeNodeDatas = context.Find(new SQLiteString("SELECT name,fromPoi,toPoi,time,routeType,XLY_DataType FROM FavoriteRouteEntity ORDER BY creatTime DESC")); } foreach (var data in routeNodeDatas) { var addr = ToTencentMapFavoriteRoute(data); if (null != addr) { routeNode.Items.Add(addr); } } //收藏街景 using (var context = new SqliteContext(dbFile)) { streetNodeDatas = context.Find(new SQLiteString("SELECT name,streetData,lastEditTime,XLY_DataType FROM FavoriteStreetEntity ORDER BY lastEditTime DESC")); } foreach (var data in streetNodeDatas) { var addr = ToTencentMapFavoriteStreet(data); if (null != addr) { streetNode.Items.Add(addr); } } } finally { } }
/// <summary> /// 解析数据 /// </summary> /// <param name="datasource"></param> public void BuildData(ContactDataSource datasource) { if (!FileHelper.IsValid(MainDbPath)) { return; } SqliteContext mainContext = null; try { var rMainDbFile = SqliteRecoveryHelper.DataRecovery(MainDbPath, @"chalib\IOS_Contact\AddressBook.sqlitedb_V7.charactor", "ABPerson,ABMultiValue,ABGroupMembers,ABGroup", true); mainContext = new SqliteContext(rMainDbFile); string groupString = "select member_id,Name from ABGroupMembers m left join ABGroup g on m.group_id == g.ROWID"; var groups = mainContext.Find(groupString); mainContext.UsingSafeConnection("select p.*,v.record_id,v.property,v.label,v.[value] from ABPerson p,ABMultiValue v WHERE p.ROWID = v.record_id", r => { Contact contact; dynamic contactObj; while (r.Read()) { contactObj = r.ToDynamic(); contact = new Contact(); contact.DataState = DynamicConvert.ToEnumByValue(contactObj.XLY_DataType, EnumDataState.Normal); //正常的联系人,目前只处理电话号码的信息,如亲属关系,社交等暂不处理。 if (contact.DataState == EnumDataState.Normal) { int propertyId = DynamicConvert.ToSafeInt(contactObj.property); if (propertyId != 3) { continue; } } contact.Name = DynamicConvert.ToSafeString(contactObj.Last) + DynamicConvert.ToSafeString(contactObj.First); contact.Name = FragmentHelper.RemoveNullityDataNew(contact.Name); contact.Number = DataParseHelper.NumberToStu(DynamicConvert.ToSafeString(contactObj.value)); // 号码过滤,验证号码长度 if (!DataParseHelper.ValidateNumber(contact.Number)) { continue; } //创建时间(最后修改时间) contact.CreateDate = DynamicConvert.ToSafeDateTime(contactObj.ModificationDate, 2001); //联系人分组 int contactId = DynamicConvert.ToSafeInt(contactObj.ROWID); var groupObj = groups.FirstOrDefault(g => DynamicConvert.ToSafeInt(g.member_id) == contactId); if (groupObj != null) { contact.GroupName = DynamicConvert.ToSafeString(groupObj.Name); } //基础备注 contact.Remark = BuildRemark(contactObj).ToString().TrimStart(';'); datasource.Items.Add(contact); } }); } finally { mainContext?.Dispose(); mainContext = null; } }
private static bool ButtomIsExistTable(string dbfile, string tablename) { var tbs = SqliteRecoveryHelper.ButtomGetAllTables(dbfile); return(tbs.Contains(tablename)); }
private static bool ButtomIsExistTableField(string dbfile, string tablename, string fieldName) { var fds = SqliteRecoveryHelper.ButtomGetTableDefin(dbfile, tablename); return(fds.Contains(fieldName)); }
private void BuildData(TreeDataSource datasource, string dbfilePath, string mmailFilePath) { var nfile = SqliteRecoveryHelper.DataRecovery(mmailFilePath, @"\chalib\Andriod_163mail\163mmail.charactor", "Account"); var context = new SqliteContext(nfile); //获取163账户。 var accountObject = context.FindByName("Account"); IEnumerable <EmailAccount> acccounts = this.GetEmailAccounts(accountObject); //获取163邮件账户对应的所有邮件。 foreach (var account in acccounts) { var sendTree = new TreeNode(); sendTree.Text = "发件箱"; sendTree.Type = typeof(EmailInfo); sendTree.Items = new DataItems <EmailInfo>(dbfilePath); var receiveTree = new TreeNode(); receiveTree.Text = "收件箱"; receiveTree.Type = typeof(EmailInfo); receiveTree.Items = new DataItems <EmailInfo>(dbfilePath); var draftsTree = new TreeNode(); draftsTree.Text = "草稿箱"; draftsTree.Type = typeof(EmailInfo); draftsTree.Items = new DataItems <EmailInfo>(dbfilePath); var deleteTree = new TreeNode(); deleteTree.Text = "删除邮件"; deleteTree.Type = typeof(EmailInfo); deleteTree.Items = new DataItems <EmailInfo>(dbfilePath); var accountTree = new TreeNode(); accountTree.Type = typeof(EmailAccount); accountTree.Items = new DataItems <EmailAccount>(dbfilePath); accountTree.Text = account.Nick + "<" + account.EmailAddress + ">"; accountTree.DataState = account.DataState; accountTree.TreeNodes.Add(sendTree); accountTree.TreeNodes.Add(receiveTree); accountTree.TreeNodes.Add(draftsTree); accountTree.TreeNodes.Add(deleteTree); accountTree.Items.Add(account); //读取账号对应邮件内容。 var tname = "Mail_" + account.Id; nfile = SqliteRecoveryHelper.DataRecovery(mmailFilePath, @"\chalib\Andriod_163mail\mmail.charactor", tname); context = new SqliteContext(nfile); var emailContentObj = context.FindByName(tname); foreach (var source in emailContentObj) { var email = new EmailInfo(); email.Receiver = JsonArrayFormatDisplay(DynamicConvert.ToSafeString(source.mailTo)); EmailUserInfo userInfo = JsonFormatDisplay(DynamicConvert.ToSafeString(source.mailFrom)); email.Sender = userInfo.Name + "<" + userInfo.MailAddress + ">"; email.Subject = DynamicConvert.ToSafeString(source.subject); email.TextContent = DynamicConvert.ToSafeString(source.textContent); email.StartDate = DynamicConvert.ToSafeDateTime(source.sendDate); email.RecvDataTime = DynamicConvert.ToSafeDateTime(source.recvDate); email.DataState = DynamicConvert.ToEnumByValue <EnumDataState>(source.XLY_DataType, EnumDataState.Normal); string tempStatus = DynamicConvert.ToSafeString(source.mailboxKey); if (tempStatus == "订阅" || tempStatus == "INBOX") { receiveTree.Items.Add(email); } else if (tempStatus == "已删除") { deleteTree.Items.Add(email); } else if (tempStatus == "已发送") { sendTree.Items.Add(email); } else { receiveTree.Items.Add(email); } } datasource.TreeNodes.Add(accountTree); } }
/// <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; } }