/* private static void BlockPrintScreen(Form f, bool bBlock) * { * if(f == null) { Debug.Assert(false); return; } * * try * { * if(bBlock) * { * NativeMethods.RegisterHotKey(f.Handle, NativeMethods.IDHOT_SNAPDESKTOP, * 0, NativeMethods.VK_SNAPSHOT); * NativeMethods.RegisterHotKey(f.Handle, NativeMethods.IDHOT_SNAPWINDOW, * NativeMethods.MOD_ALT, NativeMethods.VK_SNAPSHOT); * } * else * { * NativeMethods.UnregisterHotKey(f.Handle, NativeMethods.IDHOT_SNAPWINDOW); * NativeMethods.UnregisterHotKey(f.Handle, NativeMethods.IDHOT_SNAPDESKTOP); * } * } * catch(Exception) { Debug.Assert(false); } * } */ internal static DialogResult ShowDialog <TForm, TResult>(bool bProtect, GFunc <TForm> fnConstruct, GFunc <TForm, TResult> fnResultBuilder, out TResult r) where TForm : Form where TResult : class { if (fnConstruct == null) { Debug.Assert(false); throw new ArgumentNullException("fnConstruct"); } if (fnResultBuilder == null) { Debug.Assert(false); throw new ArgumentNullException("fnResultBuilder"); } r = null; if (!bProtect) { TForm tf = fnConstruct(); if (tf == null) { Debug.Assert(false); return(DialogResult.None); } try { DialogResult drDirect = tf.ShowDialog(); r = fnResultBuilder(tf); // Always return(drDirect); } finally { UIUtil.DestroyForm(tf); } } UIFormConstructor fnUifC = delegate(object objParam) { return(fnConstruct()); }; UIFormResultBuilder fnUifRB = delegate(Form f) { TForm tf = (f as TForm); if (tf == null) { Debug.Assert(false); return(null); } return(fnResultBuilder(tf)); }; ProtectedDialog dlg = new ProtectedDialog(fnUifC, fnUifRB); object objResult; DialogResult dr = dlg.ShowDialog(out objResult, null); r = (objResult as TResult); return(dr); }
/// <summary> /// Open a database. This function opens the specified database and updates /// the user interface. /// </summary> public void OpenDatabase(IOConnectionInfo ioConnection, CompositeKey cmpKey, bool bOpenLocal) { if(!m_bFormLoaded && Program.Config.Application.Start.MinimizedAndLocked && (ioConnection != null) && (ioConnection.Path.Length > 0)) { PwDocument ds = m_docMgr.CreateNewDocument(true); ds.LockedIoc = ioConnection.CloneDeep(); UpdateUI(true, ds, true, null, true, null, false); return; } SaveWindowState(); // KPF 1093 IOConnectionInfo ioc; if(ioConnection == null) { if(bOpenLocal) { OpenFileDialogEx ofdDb = UIUtil.CreateOpenFileDialog(KPRes.OpenDatabaseFile, UIUtil.CreateFileTypeFilter(AppDefs.FileExtension.FileExt, KPRes.KdbxFiles, true), 1, null, false, AppDefs.FileDialogContext.Database); GlobalWindowManager.AddDialog(ofdDb.FileDialog); DialogResult dr = ofdDb.ShowDialog(); GlobalWindowManager.RemoveDialog(ofdDb.FileDialog); if(dr != DialogResult.OK) return; ioc = IOConnectionInfo.FromPath(ofdDb.FileName); } else { ioc = CompleteConnectionInfo(new IOConnectionInfo(), false, true, true, true); if(ioc == null) return; } } else // ioConnection != null { ioc = CompleteConnectionInfo(ioConnection, false, true, true, false); if(ioc == null) return; } if(!ioc.CanProbablyAccess()) { MessageService.ShowWarning(ioc.GetDisplayName(), KPRes.FileNotFoundError); return; } if(OpenDatabaseRestoreIfOpened(ioc)) return; PwDatabase pwOpenedDb = null; bool bAbort; if(cmpKey == null) { for(int iTry = 0; iTry < 3; ++iTry) { OdKpfConstructParams kpfParams = new OdKpfConstructParams(); kpfParams.IOConnectionInfo = ioc; kpfParams.CanExit = IsFileLocked(null); DialogResult dr; OdKpfResult kpfResult; if(Program.Config.Security.MasterKeyOnSecureDesktop && WinUtil.IsAtLeastWindows2000 && !KeePassLib.Native.NativeLib.IsUnix()) { kpfParams.SecureDesktopMode = true; ProtectedDialog dlg = new ProtectedDialog(OdKpfConstruct, OdKpfBuildResult); object objResult; dr = dlg.ShowDialog(out objResult, kpfParams); if(dr == DialogResult.None) { Debug.Assert(false); dr = DialogResult.Cancel; } kpfResult = (objResult as OdKpfResult); if(kpfResult == null) { Debug.Assert(false); continue; } if(kpfResult.ShowHelpAfterClose) AppHelp.ShowHelp(AppDefs.HelpTopics.KeySources, null); } else // Show dialog on normal desktop { Form dlg = OdKpfConstruct(kpfParams); dr = dlg.ShowDialog(); kpfResult = (OdKpfBuildResult(dlg) as OdKpfResult); UIUtil.DestroyForm(dlg); if(kpfResult == null) { Debug.Assert(false); continue; } } if(dr == DialogResult.Cancel) break; else if(kpfResult.HasClosedWithExit) { Debug.Assert(dr == DialogResult.Abort); OnFileExit(null, null); return; } pwOpenedDb = OpenDatabaseInternal(ioc, kpfResult.Key, out bAbort); if((pwOpenedDb != null) || bAbort) break; } } else // cmpKey != null { pwOpenedDb = OpenDatabaseInternal(ioc, cmpKey, out bAbort); } if((pwOpenedDb == null) || !pwOpenedDb.IsOpen) { UpdateUIState(false); // Reset status bar text return; } string strName = pwOpenedDb.IOConnectionInfo.GetDisplayName(); m_mruList.AddItem(strName, pwOpenedDb.IOConnectionInfo.CloneDeep()); PwDocument dsExisting = m_docMgr.FindDocument(pwOpenedDb); if(dsExisting != null) m_docMgr.ActiveDocument = dsExisting; bool bCorrectDbActive = (m_docMgr.ActiveDocument.Database == pwOpenedDb); Debug.Assert(bCorrectDbActive); // AutoEnableVisualHiding(); // SetLastUsedFile(pwOpenedDb.IOConnectionInfo); RememberKeySources(pwOpenedDb); PwGroup pgRestoreSelect = null; if(bCorrectDbActive) { m_docMgr.ActiveDocument.LockedIoc = new IOConnectionInfo(); // Clear pgRestoreSelect = pwOpenedDb.RootGroup.FindGroup( pwOpenedDb.LastSelectedGroup, true); } UpdateUI(true, null, true, pgRestoreSelect, true, null, false); if(bCorrectDbActive) { SetTopVisibleGroup(pwOpenedDb.LastTopVisibleGroup); if(pgRestoreSelect != null) SetTopVisibleEntry(pgRestoreSelect.LastTopVisibleEntry); } UpdateColumnSortingIcons(); if((pwOpenedDb.MasterKeyChangeForce >= 0) && ((DateTime.Now - pwOpenedDb.MasterKeyChanged).Days >= pwOpenedDb.MasterKeyChangeForce)) { while(true) { MessageService.ShowInfo(pwOpenedDb.IOConnectionInfo.GetDisplayName() + MessageService.NewParagraph + KPRes.MasterKeyChangeForce + MessageService.NewParagraph + KPRes.MasterKeyChangeInfo); if(ChangeMasterKey(pwOpenedDb)) { UpdateUIState(true); break; } if(!AppPolicy.Current.ChangeMasterKey) break; // Prevent endless loop } } else if((pwOpenedDb.MasterKeyChangeRec >= 0) && ((DateTime.Now - pwOpenedDb.MasterKeyChanged).Days >= pwOpenedDb.MasterKeyChangeRec)) { if(MessageService.AskYesNo(pwOpenedDb.IOConnectionInfo.GetDisplayName() + MessageService.NewParagraph + KPRes.MasterKeyChangeRec + MessageService.NewParagraph + KPRes.MasterKeyChangeQ)) UpdateUIState(ChangeMasterKey(pwOpenedDb)); } if(FixDuplicateUuids(pwOpenedDb, pwOpenedDb.IOConnectionInfo)) UpdateUIState(false); // Already marked as modified if(this.FileOpened != null) { FileOpenedEventArgs ea = new FileOpenedEventArgs(pwOpenedDb); this.FileOpened(this, ea); } Program.TriggerSystem.RaiseEvent(EcasEventIDs.OpenedDatabaseFile, EcasProperty.Database, pwOpenedDb); if(bCorrectDbActive && pwOpenedDb.IsOpen) { ShowExpiredEntries(true, Program.Config.Application.FileOpening.ShowExpiredEntries, Program.Config.Application.FileOpening.ShowSoonToExpireEntries); // Avoid view being destroyed by the unlocking routine pwOpenedDb.LastSelectedGroup = PwUuid.Zero; } if(Program.Config.MainWindow.MinimizeAfterOpeningDatabase) UIUtil.SetWindowState(this, FormWindowState.Minimized); ResetDefaultFocus(null); }