Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        /// <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
            {
            }
        }
Exemplo n.º 3
0
        /// <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;
                }
            }
        }
Exemplo n.º 4
0
        /// <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;
            }
        }
Exemplo n.º 5
0
        /// <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
            {
            }
        }
Exemplo n.º 6
0
        /// <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;
            }
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        /// <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);
        }
Exemplo n.º 10
0
        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);
            }
        }
Exemplo n.º 11
0
        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);
        }
Exemplo n.º 13
0
        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);
        }
Exemplo n.º 14
0
        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);
        }
Exemplo n.º 16
0
        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();
                }
            }
        }
Exemplo n.º 17
0
        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);
        }
Exemplo n.º 20
0
        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);
        }
Exemplo n.º 21
0
        /// <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;
            }
        }
Exemplo n.º 22
0
        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
                    {
                    }
                }
            }
        }
Exemplo n.º 23
0
 public void SqliteRecoveryHelperTest2()
 {
     SqliteRecoveryHelper.DataRecovery(@"D:\111\test1.db", "", "rcontact,message,userinfo2", "", "");
 }
Exemplo n.º 24
0
        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);
            }
        }
Exemplo n.º 25
0
        /// <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;
            }
        }
Exemplo n.º 27
0
        private static bool ButtomIsExistTable(string dbfile, string tablename)
        {
            var tbs = SqliteRecoveryHelper.ButtomGetAllTables(dbfile);

            return(tbs.Contains(tablename));
        }
Exemplo n.º 28
0
        private static bool ButtomIsExistTableField(string dbfile, string tablename, string fieldName)
        {
            var fds = SqliteRecoveryHelper.ButtomGetTableDefin(dbfile, tablename);

            return(fds.Contains(fieldName));
        }
Exemplo n.º 29
0
        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);
            }
        }
Exemplo n.º 30
0
        /// <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;
            }
        }