public static bool?Import(PwDatabase pwDatabase, FileFormatProvider fmtImp, IOConnectionInfo[] vConnections, bool bSynchronize, IUIOperations uiOps, bool bForceSave, Form fParent) { if (pwDatabase == null) { throw new ArgumentNullException("pwDatabase"); } if (!pwDatabase.IsOpen) { return(null); } if (fmtImp == null) { throw new ArgumentNullException("fmtImp"); } if (vConnections == null) { throw new ArgumentNullException("vConnections"); } if (!AppPolicy.Try(AppPolicyId.Import)) { return(false); } if (!fmtImp.TryBeginImport()) { return(false); } bool bUseTempDb = (fmtImp.SupportsUuids || fmtImp.RequiresKey); bool bAllSuccess = true; // if(bSynchronize) { Debug.Assert(vFiles.Length == 1); } IStatusLogger dlgStatus; if (Program.Config.UI.ShowImportStatusDialog) { dlgStatus = new OnDemandStatusDialog(false, fParent); } else { dlgStatus = new UIBlockerStatusLogger(fParent); } dlgStatus.StartLogging(PwDefs.ShortProductName + " - " + (bSynchronize ? KPRes.Synchronizing : KPRes.ImportingStatusMsg), false); dlgStatus.SetText(bSynchronize ? KPRes.Synchronizing : KPRes.ImportingStatusMsg, LogStatusType.Info); if (vConnections.Length == 0) { try { fmtImp.Import(pwDatabase, null, dlgStatus); } catch (Exception exSingular) { if ((exSingular.Message != null) && (exSingular.Message.Length > 0)) { // slf.SetText(exSingular.Message, LogStatusType.Warning); MessageService.ShowWarning(exSingular); } } dlgStatus.EndLogging(); return(true); } foreach (IOConnectionInfo iocIn in vConnections) { Stream s = null; try { s = IOConnection.OpenRead(iocIn); } catch (Exception exFile) { MessageService.ShowWarning(iocIn.GetDisplayName(), exFile); bAllSuccess = false; continue; } if (s == null) { Debug.Assert(false); bAllSuccess = false; continue; } PwDatabase pwImp; if (bUseTempDb) { pwImp = new PwDatabase(); pwImp.New(new IOConnectionInfo(), pwDatabase.MasterKey); pwImp.MemoryProtection = pwDatabase.MemoryProtection.CloneDeep(); } else { pwImp = pwDatabase; } if (fmtImp.RequiresKey && !bSynchronize) { KeyPromptForm kpf = new KeyPromptForm(); kpf.InitEx(iocIn, false, true); if (kpf.ShowDialog() != DialogResult.OK) { s.Close(); continue; } pwImp.MasterKey = kpf.CompositeKey; } else if (bSynchronize) { pwImp.MasterKey = pwDatabase.MasterKey; } dlgStatus.SetText((bSynchronize ? KPRes.Synchronizing : KPRes.ImportingStatusMsg) + " (" + iocIn.GetDisplayName() + ")", LogStatusType.Info); try { fmtImp.Import(pwImp, s, dlgStatus); } catch (Exception excpFmt) { string strMsgEx = excpFmt.Message; if (bSynchronize && (excpFmt is InvalidCompositeKeyException)) { strMsgEx = KLRes.InvalidCompositeKey + MessageService.NewParagraph + KPRes.SynchronizingHint; } MessageService.ShowWarning(strMsgEx); s.Close(); bAllSuccess = false; continue; } s.Close(); if (bUseTempDb) { PwMergeMethod mm; if (!fmtImp.SupportsUuids) { mm = PwMergeMethod.CreateNewUuids; } else if (bSynchronize) { mm = PwMergeMethod.Synchronize; } else { ImportMethodForm imf = new ImportMethodForm(); if (imf.ShowDialog() != DialogResult.OK) { continue; } mm = imf.MergeMethod; } // slf.SetText(KPRes.MergingData, LogStatusType.Info); try { pwDatabase.MergeIn(pwImp, mm, dlgStatus); } catch (Exception exMerge) { MessageService.ShowWarning(iocIn.GetDisplayName(), KPRes.ImportFailed, exMerge); bAllSuccess = false; continue; } } } dlgStatus.EndLogging(); if (bSynchronize && bAllSuccess) { Debug.Assert(uiOps != null); if (uiOps == null) { throw new ArgumentNullException("uiOps"); } if (uiOps.UIFileSave(bForceSave)) { foreach (IOConnectionInfo ioc in vConnections) { try { if (ioc.Path != pwDatabase.IOConnectionInfo.Path) { if (pwDatabase.IOConnectionInfo.IsLocalFile() && ioc.IsLocalFile()) { File.Copy(pwDatabase.IOConnectionInfo.Path, ioc.Path, true); } else { pwDatabase.SaveAs(ioc, false, null); } } else { } // No assert (sync on save) Program.MainForm.FileMruList.AddItem(ioc.GetDisplayName(), ioc.CloneDeep(), true); } catch (Exception exSync) { MessageService.ShowWarning(KPRes.SyncFailed, pwDatabase.IOConnectionInfo.GetDisplayName() + MessageService.NewLine + ioc.GetDisplayName(), exSync); bAllSuccess = false; continue; } } } else { MessageService.ShowWarning(KPRes.SyncFailed, pwDatabase.IOConnectionInfo.GetDisplayName()); bAllSuccess = false; } } return(bAllSuccess); }
private static bool PerformImport(PwDatabase pwDatabase, FileFormatProvider fmtImp, IOConnectionInfo[] vConnections, bool bSynchronize, IUIOperations uiOps, bool bForceSave) { if (fmtImp.TryBeginImport() == false) { return(false); } bool bUseTempDb = (fmtImp.SupportsUuids || fmtImp.RequiresKey); bool bAllSuccess = true; // if(bSynchronize) { Debug.Assert(vFiles.Length == 1); } StatusLoggerForm slf = new StatusLoggerForm(); slf.InitEx(false); slf.Show(); if (bSynchronize) { slf.StartLogging(KPRes.Synchronize, false); } else { slf.StartLogging(KPRes.ImportingStatusMsg, false); } if (vConnections.Length == 0) { try { fmtImp.Import(pwDatabase, null, slf); } catch (Exception exSingular) { if ((exSingular.Message != null) && (exSingular.Message.Length > 0)) { slf.SetText(exSingular.Message, LogStatusType.Warning); MessageService.ShowWarning(exSingular); } } slf.EndLogging(); slf.Close(); return(true); } foreach (IOConnectionInfo iocIn in vConnections) { Stream s = null; try { s = IOConnection.OpenRead(iocIn); } catch (Exception exFile) { MessageService.ShowWarning(iocIn.GetDisplayName(), exFile); bAllSuccess = false; continue; } if (s == null) { Debug.Assert(false); bAllSuccess = false; continue; } PwDatabase pwImp; if (bUseTempDb) { pwImp = new PwDatabase(); pwImp.New(new IOConnectionInfo(), pwDatabase.MasterKey); pwImp.MemoryProtection = pwDatabase.MemoryProtection.CloneDeep(); } else { pwImp = pwDatabase; } if (fmtImp.RequiresKey && !bSynchronize) { KeyPromptForm kpf = new KeyPromptForm(); kpf.InitEx(iocIn.GetDisplayName(), false); if (kpf.ShowDialog() != DialogResult.OK) { s.Close(); continue; } pwImp.MasterKey = kpf.CompositeKey; } else if (bSynchronize) { pwImp.MasterKey = pwDatabase.MasterKey; } slf.SetText((bSynchronize ? KPRes.Synchronizing : KPRes.ImportingStatusMsg) + " " + iocIn.GetDisplayName(), LogStatusType.Info); try { fmtImp.Import(pwImp, s, slf); } catch (Exception excpFmt) { string strMsgEx = excpFmt.Message; if (bSynchronize) { strMsgEx += MessageService.NewParagraph + KPRes.SynchronizingHint; } MessageService.ShowWarning(strMsgEx); s.Close(); bAllSuccess = false; continue; } s.Close(); if (bUseTempDb) { PwMergeMethod mm; if (!fmtImp.SupportsUuids) { mm = PwMergeMethod.CreateNewUuids; } else if (bSynchronize) { mm = PwMergeMethod.Synchronize; } else { ImportMethodForm imf = new ImportMethodForm(); if (imf.ShowDialog() != DialogResult.OK) { continue; } mm = imf.MergeMethod; } slf.SetText(KPRes.MergingData, LogStatusType.Info); try { pwDatabase.MergeIn(pwImp, mm); } catch (Exception exMerge) { MessageService.ShowWarning(iocIn.GetDisplayName(), KPRes.ImportFailed, exMerge); bAllSuccess = false; continue; } } } slf.EndLogging(); slf.Close(); if (bSynchronize && bAllSuccess) { Debug.Assert(uiOps != null); if (uiOps == null) { throw new ArgumentNullException("uiOps"); } if (uiOps.UIFileSave(bForceSave)) { foreach (IOConnectionInfo ioc in vConnections) { try { if (pwDatabase.IOConnectionInfo.IsLocalFile()) { if ((pwDatabase.IOConnectionInfo.Path != ioc.Path) && ioc.IsLocalFile()) { File.Copy(pwDatabase.IOConnectionInfo.Path, ioc.Path, true); } } else { pwDatabase.SaveAs(ioc, false, null); } } catch (Exception exSync) { MessageService.ShowWarning(KPRes.SyncFailed, pwDatabase.IOConnectionInfo.GetDisplayName() + MessageService.NewLine + ioc.GetDisplayName(), exSync); bAllSuccess = false; continue; } } } else { MessageService.ShowWarning(KPRes.SyncFailed, pwDatabase.IOConnectionInfo.GetDisplayName()); bAllSuccess = false; } } else if (bSynchronize) // Synchronized but not successfully imported { MessageService.ShowWarning(KPRes.SyncFailed, pwDatabase.IOConnectionInfo.GetDisplayName()); bAllSuccess = false; } return(bAllSuccess); }