⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 freeotfesettings.pas

📁 文件驱动加密,功能强大,可产生加密分区,支持AES,MD2,MD4,MD5MD2, MD4, MD5, RIPEMD-128, RIPEMD-160, SHA-1, SHA-224, SHA-256,
💻 PAS
字号:
unit FreeOTFESettings;
// Description: 
// By Sarah Dean
// Email: sdean12@sdean12.org
// WWW:   http://www.FreeOTFE.org/
//
// -----------------------------------------------------------------------------
//


interface

uses
  Classes; // Required for TShortCut

type
  TDragDropFileType = (ftPrompt, ftFreeOTFE, ftLinux);

  TSettingsSaveLocation = (slNone, slExeDir, slProfile);

const
  DragDropFileTypeTitle: array [TDragDropFileType] of string = (
                                  '<prompt user>',
                                  'FreeOTFE',
                                  'Linux'
                                 );

  SettingsSaveLocationTitle: array [TSettingsSaveLocation] of string = (
                                  '<Do not save settings>',
                                  'FreeOTFE executable dir',
                                  'User profile'
                                 );

  SettingsSaveLocationSearchOrder: array [TSettingsSaveLocation] of TSettingsSaveLocation = (
                                  slExeDir,
                                  slProfile,
                                  slNone
                                 );

type
  TFreeOTFESettings = class
  protected
    function IdentifyWhereSettingsStored(): TSettingsSaveLocation;
  public
    OptSettingsVersion: integer;
    OptSaveSettings: TSettingsSaveLocation;

    // General...
    OptAllowMultipleInstances: boolean;
    OptDisplayToolbar: boolean;
    OptDisplayStatusbar: boolean;
    OptAutoStartPortable: boolean;

    // Drag 'n Drop...
    OptDragDropFileType: TDragDropFileType;

    // System tray icon related...
    OptSystemTrayIconDisplay: boolean;
    OptSystemTrayIconMinTo: boolean;
    OptSystemTrayIconCloseTo: boolean;

    // Hotkey related...
    OptHKeyEnableDismount: boolean;
    OptHKeyKeyDismount: TShortCut;
    OptHKeyEnableDismountEmerg: boolean;
    OptHKeyKeyDismountEmerg: TShortCut;

    constructor Create();
    procedure Load();
    function Save(): boolean;

    function DestroySettingsFile(loc: TSettingsSaveLocation): boolean;
    function GetSettingsFilename(loc: TSettingsSaveLocation): string;

  end;

var
  // Global variable
  Settings: TFreeOTFESettings;

implementation

uses
  INIFiles,
  Windows,  // Required to get rid of compiler hint re DeleteFile
  SysUtils,  // Required for ChangeFileExt, DeleteFile
  Dialogs,
  SDUGeneral,
  SDUDialogs,
  Menus,  // Required for ShortCutToText and TextToShortCut
  ShlObj;  // Required for CSIDL_PERSONAL

const
  SETTINGS_V1 = 1;
  SETTINGS_V2 = 2;

  // -- General section --
  SECTION_GENERAL = 'General';
    OPT_SETTINGSVERSION                          = 'SettingsVersion';
      DFLT_OPT_SETTINGSVERSION                      = SETTINGS_V2;
    OPT_SAVESETTINGS                             = 'SaveSettings';
      DFLT_OPT_SAVESETTINGS                         = slProfile;
    OPT_ALLOWMULTIPLEINSTANCES                   = 'AllowMultipleInstances';
      DFLT_OPT_ALLOWMULTIPLEINSTANCES               = FALSE;
    OPT_DISPLAYTOOLBAR                           = 'DisplayToolbar';
      DFLT_OPT_DISPLAYTOOLBAR                       = TRUE;
    OPT_DISPLAYSTATUSBAR                         = 'DisplayStatusbar';
      DFLT_OPT_DISPLAYSTATUSBAR                     = TRUE;
    OPT_AUTOSTARTPORTABLE                         = 'AutoStartPortable';
      DFLT_OPT_AUTOSTARTPORTABLE                    = FALSE;
    OPT_DRAGDROP                                 = 'DragDropFileType';
      DFLT_OPT_DRAGDROP                             = ord(ftFreeOTFE);

  // -- System tray icon section --
  SECTION_SYSTEMTRAYICON = 'SystemTrayIcon';
    OPT_SYSTEMTRAYICONDISPLAY                    = 'Display';
      DFLT_OPT_SYSTEMTRAYICONDISPLAY                = FALSE;
    OPT_SYSTEMTRAYICONMINTO                      = 'MinTo';
      DFLT_OPT_SYSTEMTRAYICONMINTO                  = FALSE;
    OPT_SYSTEMTRAYICONCLOSETO                    = 'CloseTo';
      DFLT_OPT_SYSTEMTRAYICONCLOSETO                = FALSE;

  // -- Hotkey section --
  SECTION_HOTKEY = 'Hotkeys';
    OPT_HOTKEYENABLEDISMOUNT                     = 'EnableDismount';
      DFLT_OPT_HOTKEYENABLEDISMOUNT                 = FALSE;
    OPT_HOTKEYKEYDISMOUNT                        = 'KeyDismount';
      DFLT_OPT_HOTKEYKEYDISMOUNT                    = 'Shift+Ctrl+D';
    OPT_HOTKEYENABLEDISMOUNTEMERG                = 'EnableDismountEmerg';
      DFLT_OPT_HOTKEYENABLEDISMOUNTEMERG            = FALSE;
    OPT_HOTKEYKEYDISMOUNTEMERG                   = 'KeyDismountEmerg';
      DFLT_OPT_HOTKEYKEYDISMOUNTEMERG               = 'Shift+Ctrl+Alt+D';


constructor TFreeOTFESettings.Create();
begin
  inherited;

  Load();

end;

procedure TFreeOTFESettings.Load();
var
  iniFile: TINIFile;
begin
  OptSaveSettings:= IdentifyWhereSettingsStored();
  iniFile := TINIFile.Create(GetSettingsFilename(OptSaveSettings));
  try
    OptSettingsVersion := iniFile.ReadInteger(SECTION_GENERAL, OPT_SETTINGSVERSION, SETTINGS_V1);

    OptAllowMultipleInstances := iniFile.ReadBool(SECTION_GENERAL, OPT_ALLOWMULTIPLEINSTANCES, DFLT_OPT_ALLOWMULTIPLEINSTANCES);
    OptDisplayToolbar         := iniFile.ReadBool(SECTION_GENERAL, OPT_DISPLAYTOOLBAR,         DFLT_OPT_DISPLAYTOOLBAR);
    OptDisplayStatusbar       := iniFile.ReadBool(SECTION_GENERAL, OPT_DISPLAYSTATUSBAR,       DFLT_OPT_DISPLAYSTATUSBAR);
    OptAutoStartPortable      := iniFile.ReadBool(SECTION_GENERAL, OPT_AUTOSTARTPORTABLE,      DFLT_OPT_AUTOSTARTPORTABLE);
    OptDragDropFileType       := TDragDropFileType(iniFile.ReadInteger(SECTION_GENERAL, OPT_DRAGDROP, DFLT_OPT_DRAGDROP));

    OptSystemTrayIconDisplay := iniFile.ReadBool(SECTION_SYSTEMTRAYICON, OPT_SYSTEMTRAYICONDISPLAY, DFLT_OPT_SYSTEMTRAYICONDISPLAY);
    OptSystemTrayIconMinTo   := iniFile.ReadBool(SECTION_SYSTEMTRAYICON, OPT_SYSTEMTRAYICONMINTO,   DFLT_OPT_SYSTEMTRAYICONMINTO);
    OptSystemTrayIconCloseTo := iniFile.ReadBool(SECTION_SYSTEMTRAYICON, OPT_SYSTEMTRAYICONCLOSETO, DFLT_OPT_SYSTEMTRAYICONCLOSETO);

    OptHKeyEnableDismount      := iniFile.ReadBool(SECTION_HOTKEY,   OPT_HOTKEYENABLEDISMOUNT,      DFLT_OPT_HOTKEYENABLEDISMOUNT);
    OptHKeyKeyDismount         := TextToShortCut(iniFile.ReadString(SECTION_HOTKEY, OPT_HOTKEYKEYDISMOUNT,         DFLT_OPT_HOTKEYKEYDISMOUNT));
    OptHKeyEnableDismountEmerg := iniFile.ReadBool(SECTION_HOTKEY,   OPT_HOTKEYENABLEDISMOUNTEMERG, DFLT_OPT_HOTKEYENABLEDISMOUNTEMERG);
    OptHKeyKeyDismountEmerg    := TextToShortCut(iniFile.ReadString(SECTION_HOTKEY, OPT_HOTKEYKEYDISMOUNTEMERG,    DFLT_OPT_HOTKEYKEYDISMOUNTEMERG));
  finally
    iniFile.Free();
  end;

end;

function TFreeOTFESettings.Save(): boolean;
var
  allOK: boolean;
  iniFile: TINIFile;
  filename: string;
begin
  allOK := TRUE;
  if (OptSaveSettings <> slNone) then
    begin
    filename := GetSettingsFilename(OptSaveSettings);
    try
      iniFile := TINIFile.Create(filename);
      try
        iniFile.WriteInteger(SECTION_GENERAL, OPT_SETTINGSVERSION,        SETTINGS_V2);

        iniFile.WriteBool(SECTION_GENERAL,    OPT_ALLOWMULTIPLEINSTANCES, OptAllowMultipleInstances);
        iniFile.WriteBool(SECTION_GENERAL,    OPT_DISPLAYTOOLBAR,         OptDisplayToolbar);
        iniFile.WriteBool(SECTION_GENERAL,    OPT_DISPLAYSTATUSBAR,       OptDisplayStatusbar);
        iniFile.WriteBool(SECTION_GENERAL,    OPT_AUTOSTARTPORTABLE,      OptAutoStartPortable);
        iniFile.WriteInteger(SECTION_GENERAL, OPT_DRAGDROP,               ord(OptDragDropFileType));

        iniFile.WriteBool(SECTION_SYSTEMTRAYICON, OPT_SYSTEMTRAYICONDISPLAY, OptSystemTrayIconDisplay);
        iniFile.WriteBool(SECTION_SYSTEMTRAYICON, OPT_SYSTEMTRAYICONMINTO,   OptSystemTrayIconMinTo);
        iniFile.WriteBool(SECTION_SYSTEMTRAYICON, OPT_SYSTEMTRAYICONCLOSETO, OptSystemTrayIconCloseTo);

        iniFile.WriteBool(SECTION_HOTKEY,   OPT_HOTKEYENABLEDISMOUNT,      OptHKeyEnableDismount);
        iniFile.WriteString(SECTION_HOTKEY, OPT_HOTKEYKEYDISMOUNT,         ShortCutToText(OptHKeyKeyDismount));
        iniFile.WriteBool(SECTION_HOTKEY,   OPT_HOTKEYENABLEDISMOUNTEMERG, OptHKeyEnableDismountEmerg);
        iniFile.WriteString(SECTION_HOTKEY, OPT_HOTKEYKEYDISMOUNTEMERG,    ShortCutToText(OptHKeyKeyDismountEmerg));
      finally
        iniFile.Free();
      end;

    except
      on E: Exception do
        begin
        allOK := FALSE;

        SDUMessageDlg(
                   'Your settings could not be saved.'+SDUCRLF+
                   SDUCRLF+
                   'Please ensure that you have suitable access rights in order to write to:'+SDUCRLF+
                   SDUCRLF+
                   filename,
                   mtError,
                   [mbOK],
                   0
                  );
        end;
    end;

    end;

  Result := allOK;
end;

function TFreeOTFESettings.DestroySettingsFile(loc: TSettingsSaveLocation): boolean;
var
  filename: string;
begin
  filename := GetSettingsFilename(loc);
  Result := DeleteFile(filename);
end;

function TFreeOTFESettings.GetSettingsFilename(loc: TSettingsSaveLocation): string;
var
  iniFilenameOnly: string;
  filenameAndPath: string;
begin
  filenameAndPath := '';

  iniFilenameOnly := ChangeFileExt(ExtractFilename(ParamStr(0)), '.ini');

  if (loc = slNone) then
    begin
    // Do nothing; already set to empty string
    end
  else if (loc = slExeDir) then
    begin
    filenameAndPath := ExtractFilePath(ParamStr(0)) + iniFilenameOnly;
    end
  else if (loc = slProfile) then
    begin
    filenameAndPath := SDUGetSpecialFolderPath(CSIDL_PERSONAL)+
                       '\'+
                       iniFilenameOnly
    end
  else
    begin
    showmessage('Unknown settings location?! Please report seeing this message!');
    end;

  Result := filenameAndPath;
end;

// Identify where user settings are stored
function TFreeOTFESettings.IdentifyWhereSettingsStored(): TSettingsSaveLocation;
var
  sl: TSettingsSaveLocation;
  filename: string;
  retval: TSettingsSaveLocation;
  checkLocation: TSettingsSaveLocation;
begin
  retval := slNone;

  for sl := low(SettingsSaveLocationSearchOrder) to high(SettingsSaveLocationSearchOrder) do
    begin
    checkLocation := SettingsSaveLocationSearchOrder[sl];
    filename := GetSettingsFilename(checkLocation);
    if (
        (filename <> '') and
        FileExists(filename)
       ) then
      begin
      retval := checkLocation;
      break;
      end;

    end;

  Result := retval;
end;


END.


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -