private static DateTime ParseDateTime(ref string strData, CsvFieldInfo cfi,
                                              DateTime dtDefault)
        {
            bool bDummy;

            return(ParseDateTime(ref strData, cfi, dtDefault, out bDummy));
        }
        private List <CsvFieldInfo> GetCsvFieldInfos()
        {
            List <CsvFieldInfo> lFields = new List <CsvFieldInfo>();

            for (int i = 0; i < m_lvFields.Items.Count; ++i)
            {
                CsvFieldInfo cfi = (m_lvFields.Items[i].Tag as CsvFieldInfo);
                if (cfi == null)
                {
                    Debug.Assert(false); continue;
                }
                lFields.Add(cfi);
            }

            return(lFields);
        }
        private static DateTime ParseDateTime(ref string strData, CsvFieldInfo cfi,
                                              DateTime dtDefault, out bool bSuccess)
        {
            DateTime?odt = null;

            if (!string.IsNullOrEmpty(cfi.Format))
            {
                const DateTimeStyles dts = (DateTimeStyles.AllowWhiteSpaces |
                                            DateTimeStyles.AssumeLocal);

                DateTime dtExact;
                if (DateTime.TryParseExact(strData, cfi.Format, null, dts,
                                           out dtExact))
                {
                    odt = TimeUtil.ToUtc(dtExact, false);
                }
            }

            if (!odt.HasValue)
            {
                DateTime dtStd;
                if (DateTime.TryParse(strData, out dtStd))
                {
                    odt = TimeUtil.ToUtc(dtStd, false);
                }
            }

            if (odt.HasValue)
            {
                strData  = TimeUtil.ToDisplayString(odt.Value);
                bSuccess = true;
            }
            else
            {
                strData  = string.Empty;
                bSuccess = false;

                odt = dtDefault;
            }

            return(odt.Value);
        }
        private void PerformImport(PwGroup pgStorage, bool bCreatePreview)
        {
            List <CsvFieldInfo> lFields = GetCsvFieldInfos();

            if (bCreatePreview)
            {
                int dx = m_lvImportPreview.ClientRectangle.Width;                 // Before clearing

                m_lvImportPreview.Items.Clear();
                m_lvImportPreview.Columns.Clear();

                foreach (CsvFieldInfo cfi in lFields)
                {
                    string strCol = CsvFieldToString(cfi.Type);
                    if (cfi.Type == CsvFieldType.CustomString)
                    {
                        strCol = (cfi.Name ?? string.Empty);
                    }
                    m_lvImportPreview.Columns.Add(strCol, dx / lFields.Count);
                }
            }

            CsvOptions opt = GetCsvOptions();

            if (opt == null)
            {
                Debug.Assert(bCreatePreview); return;
            }

            string            strData = GetDecodedText();
            CsvStreamReaderEx csr     = new CsvStreamReaderEx(strData, opt);

            Dictionary <string, PwGroup> dGroups = new Dictionary <string, PwGroup>();

            dGroups[string.Empty] = pgStorage;

            if (bCreatePreview)
            {
                m_lvImportPreview.BeginUpdate();
            }

            DateTime dtNow           = DateTime.UtcNow;
            DateTime dtNoExpire      = KdbTime.NeverExpireTime.ToDateTime();
            bool     bIgnoreFirstRow = m_cbIgnoreFirst.Checked;
            bool     bIsFirstRow     = true;
            bool     bMergeGroups    = m_cbMergeGroups.Checked;

            while (true)
            {
                string[] v = csr.ReadLine();
                if (v == null)
                {
                    break;
                }
                if (v.Length == 0)
                {
                    continue;
                }
                if ((v.Length == 1) && (v[0].Length == 0))
                {
                    continue;
                }

                if (bIsFirstRow && bIgnoreFirstRow)
                {
                    bIsFirstRow = false;
                    continue;
                }
                bIsFirstRow = false;

                PwGroup pg = pgStorage;
                PwEntry pe = new PwEntry(true, true);

                ListViewItem lvi = null;
                for (int i = 0; i < Math.Min(v.Length, lFields.Count); ++i)
                {
                    string       strField = v[i];
                    CsvFieldInfo cfi      = lFields[i];

                    if (cfi.Type == CsvFieldType.Ignore)
                    {
                    }
                    else if (cfi.Type == CsvFieldType.Group)
                    {
                        pg = FindCreateGroup(strField, pgStorage, dGroups,
                                             cfi.Format, opt, bMergeGroups);
                    }
                    else if (cfi.Type == CsvFieldType.Title)
                    {
                        ImportUtil.AppendToField(pe, PwDefs.TitleField,
                                                 strField, m_pwDatabase);
                    }
                    else if (cfi.Type == CsvFieldType.UserName)
                    {
                        ImportUtil.AppendToField(pe, PwDefs.UserNameField,
                                                 strField, m_pwDatabase);
                    }
                    else if (cfi.Type == CsvFieldType.Password)
                    {
                        ImportUtil.AppendToField(pe, PwDefs.PasswordField,
                                                 strField, m_pwDatabase);
                    }
                    else if (cfi.Type == CsvFieldType.Url)
                    {
                        ImportUtil.AppendToField(pe, PwDefs.UrlField,
                                                 strField, m_pwDatabase);
                    }
                    else if (cfi.Type == CsvFieldType.Notes)
                    {
                        ImportUtil.AppendToField(pe, PwDefs.NotesField,
                                                 strField, m_pwDatabase);
                    }
                    else if (cfi.Type == CsvFieldType.CustomString)
                    {
                        ImportUtil.AppendToField(pe, (string.IsNullOrEmpty(cfi.Name) ?
                                                      PwDefs.NotesField : cfi.Name), strField, m_pwDatabase);
                    }
                    else if (cfi.Type == CsvFieldType.CreationTime)
                    {
                        pe.CreationTime = ParseDateTime(ref strField, cfi, dtNow);
                    }
                    // else if(cfi.Type == CsvFieldType.LastAccessTime)
                    //	pe.LastAccessTime = ParseDateTime(ref strField, cfi, dtNow);
                    else if (cfi.Type == CsvFieldType.LastModTime)
                    {
                        pe.LastModificationTime = ParseDateTime(ref strField, cfi, dtNow);
                    }
                    else if (cfi.Type == CsvFieldType.ExpiryTime)
                    {
                        bool bParseSuccess;
                        pe.ExpiryTime = ParseDateTime(ref strField, cfi, dtNow,
                                                      out bParseSuccess);
                        pe.Expires = (bParseSuccess && (pe.ExpiryTime != dtNoExpire));
                    }
                    else if (cfi.Type == CsvFieldType.Tags)
                    {
                        StrUtil.AddTags(pe.Tags, StrUtil.StringToTags(strField));
                    }
                    else
                    {
                        Debug.Assert(false);
                    }

                    if (bCreatePreview)
                    {
                        strField = StrUtil.MultiToSingleLine(strField);

                        if (lvi != null)
                        {
                            lvi.SubItems.Add(strField);
                        }
                        else
                        {
                            lvi = m_lvImportPreview.Items.Add(strField);
                        }
                    }
                }

                if (bCreatePreview)
                {
                    // Create remaining subitems
                    for (int r = v.Length; r < lFields.Count; ++r)
                    {
                        if (lvi != null)
                        {
                            lvi.SubItems.Add(string.Empty);
                        }
                        else
                        {
                            lvi = m_lvImportPreview.Items.Add(string.Empty);
                        }
                    }
                }

                pg.AddEntry(pe, true);
            }

            if (bCreatePreview)
            {
                m_lvImportPreview.EndUpdate();
                ProcessResize();
            }
        }
        private bool GuessFieldTypes()
        {
            CsvOptions opt = GetCsvOptions();

            if (opt == null)
            {
                Debug.Assert(false); return(false);
            }

            string            strData = GetDecodedText();
            CsvStreamReaderEx csv     = new CsvStreamReaderEx(strData, opt);

            string[] v;
            while (true)
            {
                v = csv.ReadLine();
                if (v == null)
                {
                    return(false);
                }
                if (v.Length == 0)
                {
                    continue;
                }
                if ((v.Length == 1) && (v[0].Length == 0))
                {
                    continue;
                }
                break;
            }
            if (v.Length <= 3)
            {
                return(false);
            }

            CsvFieldInfo[] vFields     = new CsvFieldInfo[v.Length];
            int            nDetermined = 0;

            for (int i = 0; i < v.Length; ++i)
            {
                CsvFieldInfo fi = GuessFieldType(v[i]);
                if (fi != null)
                {
                    ++nDetermined;
                }
                else
                {
                    fi = new CsvFieldInfo(CsvFieldType.Ignore, null, null);
                }

                vFields[i] = fi;
            }

            // Accept the guesses only if at least half of them are
            // probably correct
            if (nDetermined < (v.Length + 1) / 2)
            {
                return(false);
            }

            m_lvFields.Items.Clear();
            foreach (CsvFieldInfo fi in vFields)
            {
                AddCsvField(fi.Type, fi.Name, fi.Format);
            }

            return(true);
        }
Exemple #6
0
        private bool GuessFieldTypes()
        {
            CsvOptions opt = GetCsvOptions();
            if(opt == null) { Debug.Assert(false); return false; }

            string strData = GetDecodedText();
            CsvStreamReaderEx csv = new CsvStreamReaderEx(strData, opt);

            string[] v;
            while(true)
            {
                v = csv.ReadLine();
                if(v == null) return false;
                if(v.Length == 0) continue;
                if((v.Length == 1) && (v[0].Length == 0)) continue;
                break;
            }
            if(v.Length <= 3) return false;

            CsvFieldInfo[] vFields = new CsvFieldInfo[v.Length];
            int nDetermined = 0;
            for(int i = 0; i < v.Length; ++i)
            {
                CsvFieldInfo fi = GuessFieldType(v[i]);
                if(fi != null) ++nDetermined;
                else fi = new CsvFieldInfo(CsvFieldType.Ignore, null, null);

                vFields[i] = fi;
            }

            // Accept the guesses only if at least half of them are
            // probably correct
            if(nDetermined < (v.Length + 1) / 2) return false;

            m_lvFields.Items.Clear();
            foreach(CsvFieldInfo fi in vFields)
                AddCsvField(fi.Type, fi.Name, fi.Format);

            return true;
        }
Exemple #7
0
        private static DateTime ParseDateTime(ref string strData, CsvFieldInfo cfi,
			DateTime dtDefault, out bool bSuccess)
        {
            DateTime? odt = null;

            if(!string.IsNullOrEmpty(cfi.Format))
            {
                const DateTimeStyles dts = (DateTimeStyles.AllowWhiteSpaces |
                    DateTimeStyles.AssumeLocal);

                DateTime dtExact;
                if(DateTime.TryParseExact(strData, cfi.Format, null, dts,
                    out dtExact))
                    odt = dtExact;
            }

            if(!odt.HasValue)
            {
                DateTime dtStd;
                if(DateTime.TryParse(strData, out dtStd))
                    odt = dtStd;
            }

            if(odt.HasValue)
            {
                strData = TimeUtil.ToDisplayString(odt.Value);
                bSuccess = true;
            }
            else
            {
                strData = string.Empty;
                bSuccess = false;

                odt = dtDefault;
            }

            return odt.Value;
        }
Exemple #8
0
        private static DateTime ParseDateTime(ref string strData, CsvFieldInfo cfi,
			DateTime dtDefault)
        {
            bool bDummy;
            return ParseDateTime(ref strData, cfi, dtDefault, out bDummy);
        }