mirror of
https://github.com/rejetto/hfs2.git
synced 2025-12-19 10:03:56 +01:00
first commit
This commit is contained in:
commit
b654228675
13
.gitignore
vendored
Normal file
13
.gitignore
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
tmp/
|
||||
__history/
|
||||
__recovery/
|
||||
win32/
|
||||
*.vfs
|
||||
*.dcu
|
||||
*.exe
|
||||
*.map
|
||||
hfs.ini
|
||||
*.tmp
|
||||
*.bak
|
||||
*.*-
|
||||
*.corrupted
|
||||
21
WindowsXP.manifest
Normal file
21
WindowsXP.manifest
Normal file
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<assemblyIdentity
|
||||
name="CiaoSoftware.Ciao.Shell.Contacts"
|
||||
processorArchitecture="x86"
|
||||
version="5.1.0.0"
|
||||
type="win32"/>
|
||||
<description>Windows Shell</description>
|
||||
<dependency>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity
|
||||
type="win32"
|
||||
name="Microsoft.Windows.Common-Controls"
|
||||
version="6.0.0.0"
|
||||
processorArchitecture="x86"
|
||||
publicKeyToken="6595b64144ccf1df"
|
||||
language="*"
|
||||
/>
|
||||
</dependentAssembly>
|
||||
</dependency>
|
||||
</assembly>
|
||||
11
alias.txt
Normal file
11
alias.txt
Normal file
@ -0,0 +1,11 @@
|
||||
var length=length|var=$1
|
||||
cache=trim|{.set|#cache.tmp|{.from table|$1|$2.}.} {.if not|{.^#cache.tmp.}|{:{.set|#cache.tmp|{.dequote|$3.}.}{.set table|$1|$2={.^#cache.tmp.}.}:}.} {.^#cache.tmp.} {.set|#cache.tmp.}
|
||||
is substring=pos|$1|$2
|
||||
set append=set|$1|$2|mode=append
|
||||
123 if 2=if|$2|$1$2$3
|
||||
between=if|{.$1 < $3.}|{:{.and|{.$1 <= $2.}|{.$2 <= $3.}:}|{:{.and|{.$3 <= $2.}|{.$2 <= $1.}:}
|
||||
between!=if|{.$1 < $3.}|{:{.and|{.$1 < $2.}|{.$2 < $3.}:}|{:{.and|{.$3 < $2.}|{.$2 < $1.}:}
|
||||
file changed=if| {.{.filetime|$1.} > {.^#file changed.$1.}.}|{: {.set|#file changed.$1|{.filetime|$1.}.} {.if|$2|{:{.load|$1|var=$2.}:}.} 1:}
|
||||
play system event=play
|
||||
redirect=add header|Location: $1
|
||||
chop={.cut|{.calc|{.pos|$2|var=$1.}+{.length|$2.}.}||var=$1|remainder=#chop.tmp.}{.^#chop.tmp.}
|
||||
1213
classesLib.pas
Normal file
1213
classesLib.pas
Normal file
File diff suppressed because it is too large
Load Diff
6
copyright.txt
Normal file
6
copyright.txt
Normal file
@ -0,0 +1,6 @@
|
||||
HFS version %s, Copyright (C) 2002-2020 Massimo Melina (www.rejetto.com)
|
||||
HFS comes with ABSOLUTELY NO WARRANTY; for details click Menu -> Web links -> License
|
||||
This is FREE software, and you are welcome to redistribute it
|
||||
under certain conditions.
|
||||
|
||||
Build #%s
|
||||
1
country.cache
Normal file
1
country.cache
Normal file
@ -0,0 +1 @@
|
||||
127.0.0.1=(Private Address) (XX)
|
||||
12
data.rc
Normal file
12
data.rc
Normal file
@ -0,0 +1,12 @@
|
||||
1 24 "WindowsXP.manifest"
|
||||
defaultTpl TEXT default.tpl
|
||||
copyright TEXT copyright.txt
|
||||
dmBrowserTpl TEXT dmBrowser.tpl
|
||||
invertban TEXT invertban.txt
|
||||
filelistTpl TEXT filelist.tpl
|
||||
uploadDisabled TEXT upload_disabled.txt
|
||||
uploadHowTo TEXT upload_how.txt
|
||||
alias TEXT alias.txt
|
||||
shell GIF shell.gif
|
||||
IPservices TEXT ipservices.txt
|
||||
jquery TEXT jquery.min.js
|
||||
1155
default.tpl
Normal file
1155
default.tpl
Normal file
File diff suppressed because one or more lines are too long
11
defs.inc
Normal file
11
defs.inc
Normal file
@ -0,0 +1,11 @@
|
||||
{$DEFINE STABLE }
|
||||
{$IFDEF STABLE }
|
||||
{$ASSERTIONS OFF}
|
||||
{$ELSE}
|
||||
{$ASSERTIONS ON}
|
||||
{!$DEFINE EX_DEBUG}
|
||||
{$ENDIF}
|
||||
{$WARN SYMBOL_PLATFORM off }
|
||||
{$WARN UNIT_PLATFORM off }
|
||||
{$I-}
|
||||
{$INLINE AUTO}
|
||||
18
deprecated.txt
Normal file
18
deprecated.txt
Normal file
@ -0,0 +1,18 @@
|
||||
In the template system, the following %symbols% and [sections] are currently deprecated, because they have been surpassed by {.macros.}.
|
||||
They are still available for backward compatibilty in 2.x versions, but they are likely not be there since version 3.
|
||||
|
||||
%sym-ANY%
|
||||
equivalent: {.$sym-ANY.}
|
||||
note: you are not forced anymore to start the section name by "sym-"
|
||||
|
||||
%up%
|
||||
equivalent: {.if| {.%folder% = / .} | {.$up.} .}
|
||||
note: you are not forced anymore in keeping the code inside section [up]
|
||||
|
||||
%item-added% and %item-modified%
|
||||
equivalent: {.time||when=%item-added-dt%.}
|
||||
|
||||
%new%
|
||||
equivalent: {.if| {.get|is new.} | {.$newfile.} .}
|
||||
note: you are not forced anymore in keeping the code inside section [newfile]
|
||||
|
||||
29
developer notes.txt
Normal file
29
developer notes.txt
Normal file
@ -0,0 +1,29 @@
|
||||
=== LIBS USED
|
||||
ICS v7 by François PIETTE http://www.overbyte.be
|
||||
GIFimage v2.2r5 by Anders Melander http://www.tolderlund.eu/delphi/
|
||||
delphi zlib v1.2.3 by base2 technologies http://www.base2ti.com
|
||||
TRegExpr v0.952 by Andrey V. Sorokin http://www.regexpstudio.com/TRegExpr/TRegExpr.html
|
||||
fastMM v4 by Pierre le Riche http://fastmm.sourceforge.net
|
||||
Kryvich's Delphi Localizer v3.2 https://sites.google.com/site/kryvich/
|
||||
|
||||
|
||||
=== CGI
|
||||
see python\Lib\CGIHTTPServer.py
|
||||
|
||||
=== CAPABILITIES OF A SCRIPTING SYSTEMS
|
||||
- skip limits on some files
|
||||
|
||||
=== UNICODE FILENAMES
|
||||
widgets required:
|
||||
- treeview (vfs)
|
||||
- listbox (connections)
|
||||
- richedit (log)
|
||||
|
||||
code to adapt
|
||||
- TfileListing.fromFolder()
|
||||
- getVFS()
|
||||
- setVFS()
|
||||
|
||||
=== DEFAULT TEMPLATE
|
||||
- detect mobile and use special template
|
||||
|
||||
27
diffDlg.dfm
Normal file
27
diffDlg.dfm
Normal file
@ -0,0 +1,27 @@
|
||||
object diffFrm: TdiffFrm
|
||||
Left = 261
|
||||
Top = 149
|
||||
Caption = 'Customized options'
|
||||
ClientHeight = 334
|
||||
ClientWidth = 432
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
Position = poMainFormCenter
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object memoBox: TMemo
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 432
|
||||
Height = 334
|
||||
Align = alClient
|
||||
ReadOnly = True
|
||||
ScrollBars = ssBoth
|
||||
TabOrder = 0
|
||||
end
|
||||
end
|
||||
25
diffDlg.pas
Normal file
25
diffDlg.pas
Normal file
@ -0,0 +1,25 @@
|
||||
unit diffDlg;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, StdCtrls;
|
||||
|
||||
type
|
||||
TdiffFrm = class(TForm)
|
||||
memoBox: TMemo;
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
var
|
||||
diffFrm: TdiffFrm;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
end.
|
||||
40
dmBrowser.tpl
Normal file
40
dmBrowser.tpl
Normal file
@ -0,0 +1,40 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>HFS %folder%</title>
|
||||
</head><body>
|
||||
%up%
|
||||
%files%
|
||||
</body>
|
||||
</html>
|
||||
|
||||
[up]
|
||||
<a class=folder href="%parent-folder%">UP</a>
|
||||
|
||||
[nofiles]
|
||||
<div class=folder>No files</div>
|
||||
|
||||
[files]
|
||||
%list%
|
||||
|
||||
[file]
|
||||
<a href="%item-url%">%item-name%</a>
|
||||
|
||||
[folder]
|
||||
<a href="%item-url%">%item-name%</a>
|
||||
|
||||
[comment]
|
||||
<div class=comment>%item-comment%</div>
|
||||
|
||||
[error-page]
|
||||
<html><head></head><body>
|
||||
%content%
|
||||
</body>
|
||||
</html>
|
||||
|
||||
[not found]
|
||||
<h1>404 - Not found</h1>
|
||||
<a href='/'>go to root</a>
|
||||
|
||||
[overload]
|
||||
<h1>Server busy</h1>
|
||||
Please, retry later.
|
||||
11
filelist.tpl
Normal file
11
filelist.tpl
Normal file
@ -0,0 +1,11 @@
|
||||
%files%
|
||||
|
||||
[files]
|
||||
%list%
|
||||
|
||||
[file]
|
||||
%item-full-url%
|
||||
|
||||
[folder]
|
||||
%item-full-url%
|
||||
|
||||
417
filepropDlg.dfm
Normal file
417
filepropDlg.dfm
Normal file
@ -0,0 +1,417 @@
|
||||
object filepropFrm: TfilepropFrm
|
||||
Left = 0
|
||||
Top = 0
|
||||
Caption = 'filepropFrm'
|
||||
ClientHeight = 401
|
||||
ClientWidth = 393
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
KeyPreview = True
|
||||
OldCreateOrder = False
|
||||
Position = poMainFormCenter
|
||||
ShowHint = True
|
||||
OnClose = FormClose
|
||||
OnKeyPress = FormKeyPress
|
||||
OnShow = FormShow
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object pages: TPageControl
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 393
|
||||
Height = 366
|
||||
ActivePage = flagsTab
|
||||
Align = alClient
|
||||
ParentShowHint = False
|
||||
RaggedRight = True
|
||||
ShowHint = True
|
||||
TabOrder = 0
|
||||
object permTab: TTabSheet
|
||||
Caption = 'Permissions'
|
||||
ImageIndex = 1
|
||||
object actionTabs: TTabControl
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 385
|
||||
Height = 338
|
||||
Align = alClient
|
||||
MultiLine = True
|
||||
TabOrder = 0
|
||||
OnChange = actionTabsChange
|
||||
DesignSize = (
|
||||
385
|
||||
338)
|
||||
object newaccBtn: TButton
|
||||
Left = 278
|
||||
Top = 56
|
||||
Width = 92
|
||||
Height = 25
|
||||
Anchors = [akTop, akRight]
|
||||
Caption = 'New account'
|
||||
TabOrder = 0
|
||||
OnClick = newaccBtnClick
|
||||
end
|
||||
object anyAccChk: TCheckBox
|
||||
Left = 278
|
||||
Top = 151
|
||||
Width = 97
|
||||
Height = 17
|
||||
Anchors = [akTop, akRight]
|
||||
Caption = 'Any account'
|
||||
TabOrder = 1
|
||||
OnClick = anonChkClick
|
||||
end
|
||||
object anonChk: TCheckBox
|
||||
Left = 278
|
||||
Top = 183
|
||||
Width = 97
|
||||
Height = 17
|
||||
Anchors = [akTop, akRight]
|
||||
Caption = 'Anonymous'
|
||||
TabOrder = 2
|
||||
OnClick = anonChkClick
|
||||
end
|
||||
object allBtn: TButton
|
||||
Left = 278
|
||||
Top = 95
|
||||
Width = 92
|
||||
Height = 25
|
||||
Anchors = [akTop, akRight]
|
||||
Caption = 'All / None'
|
||||
TabOrder = 3
|
||||
OnClick = allBtnClick
|
||||
end
|
||||
object accountsBox: TListView
|
||||
Left = 16
|
||||
Top = 40
|
||||
Width = 247
|
||||
Height = 285
|
||||
Anchors = [akLeft, akTop, akRight, akBottom]
|
||||
Checkboxes = True
|
||||
Columns = <>
|
||||
TabOrder = 4
|
||||
ViewStyle = vsList
|
||||
OnChange = accountsBoxChange
|
||||
OnGetImageIndex = accountsBoxGetImageIndex
|
||||
end
|
||||
object anyoneChk: TCheckBox
|
||||
Left = 278
|
||||
Top = 216
|
||||
Width = 97
|
||||
Height = 17
|
||||
Anchors = [akTop, akRight]
|
||||
Caption = 'Anyone'
|
||||
TabOrder = 5
|
||||
OnClick = anonChkClick
|
||||
end
|
||||
object goToAccountsBtn: TButton
|
||||
Left = 278
|
||||
Top = 288
|
||||
Width = 92
|
||||
Height = 33
|
||||
Anchors = [akTop, akRight]
|
||||
Caption = 'Manage accounts'
|
||||
TabOrder = 6
|
||||
WordWrap = True
|
||||
OnClick = goToAccountsBtnClick
|
||||
end
|
||||
end
|
||||
end
|
||||
object flagsTab: TTabSheet
|
||||
Caption = 'Flags'
|
||||
ImageIndex = 2
|
||||
object hiddenChk: TCheckBox
|
||||
Left = 32
|
||||
Top = 24
|
||||
Width = 180
|
||||
Height = 17
|
||||
Hint = 'Test'
|
||||
Caption = 'Hidden'
|
||||
Enabled = False
|
||||
TabOrder = 0
|
||||
end
|
||||
object hidetreeChk: TCheckBox
|
||||
Left = 32
|
||||
Top = 56
|
||||
Width = 180
|
||||
Height = 17
|
||||
Caption = 'Recursively hidden'
|
||||
Enabled = False
|
||||
TabOrder = 1
|
||||
end
|
||||
object archivableChk: TCheckBox
|
||||
Left = 32
|
||||
Top = 121
|
||||
Width = 273
|
||||
Height = 17
|
||||
Caption = 'Archivable'
|
||||
Enabled = False
|
||||
TabOrder = 2
|
||||
end
|
||||
object browsableChk: TCheckBox
|
||||
Left = 32
|
||||
Top = 88
|
||||
Width = 97
|
||||
Height = 17
|
||||
Caption = 'Browsable'
|
||||
Enabled = False
|
||||
TabOrder = 3
|
||||
end
|
||||
object dontlogChk: TCheckBox
|
||||
Left = 32
|
||||
Top = 184
|
||||
Width = 97
|
||||
Height = 17
|
||||
Caption = 'Don'#39't log'
|
||||
Enabled = False
|
||||
TabOrder = 4
|
||||
end
|
||||
object nodlChk: TCheckBox
|
||||
Left = 32
|
||||
Top = 152
|
||||
Width = 97
|
||||
Height = 17
|
||||
Caption = 'No download'
|
||||
Enabled = False
|
||||
TabOrder = 5
|
||||
end
|
||||
object dontconsiderChk: TCheckBox
|
||||
Left = 32
|
||||
Top = 216
|
||||
Width = 273
|
||||
Height = 17
|
||||
Caption = 'Don'#39't consider as download'
|
||||
Enabled = False
|
||||
TabOrder = 6
|
||||
end
|
||||
object hideemptyChk: TCheckBox
|
||||
Left = 32
|
||||
Top = 249
|
||||
Width = 313
|
||||
Height = 17
|
||||
Caption = 'Auto-hide empty folders'
|
||||
Enabled = False
|
||||
TabOrder = 7
|
||||
end
|
||||
object hideextChk: TCheckBox
|
||||
Left = 32
|
||||
Top = 280
|
||||
Width = 201
|
||||
Height = 17
|
||||
Caption = 'Hide file extension in listing'
|
||||
Enabled = False
|
||||
TabOrder = 8
|
||||
end
|
||||
end
|
||||
object diffTab: TTabSheet
|
||||
Caption = 'Diff template'
|
||||
ImageIndex = 3
|
||||
object difftplBox: TMemo
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 385
|
||||
Height = 338
|
||||
Hint =
|
||||
'Here you can put a partial template that will overlap the main o' +
|
||||
'ne.'
|
||||
Align = alClient
|
||||
ScrollBars = ssVertical
|
||||
TabOrder = 0
|
||||
OnEnter = textinputEnter
|
||||
end
|
||||
end
|
||||
object commentTab: TTabSheet
|
||||
Caption = 'Comment'
|
||||
ImageIndex = 4
|
||||
object commentBox: TMemo
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 385
|
||||
Height = 338
|
||||
Align = alClient
|
||||
ScrollBars = ssVertical
|
||||
TabOrder = 0
|
||||
OnEnter = textinputEnter
|
||||
end
|
||||
end
|
||||
object maskTab: TTabSheet
|
||||
Caption = 'File masks'
|
||||
ImageIndex = 5
|
||||
DesignSize = (
|
||||
385
|
||||
338)
|
||||
object filesfilterBox: TLabeledEdit
|
||||
Left = 10
|
||||
Top = 32
|
||||
Width = 365
|
||||
Height = 21
|
||||
Anchors = [akLeft, akTop, akRight]
|
||||
EditLabel.Width = 46
|
||||
EditLabel.Height = 13
|
||||
EditLabel.Caption = 'Files filter'
|
||||
Enabled = False
|
||||
TabOrder = 0
|
||||
OnEnter = textinputEnter
|
||||
end
|
||||
object foldersfilterBox: TLabeledEdit
|
||||
Left = 10
|
||||
Top = 78
|
||||
Width = 365
|
||||
Height = 21
|
||||
Anchors = [akLeft, akTop, akRight]
|
||||
EditLabel.Width = 60
|
||||
EditLabel.Height = 13
|
||||
EditLabel.Caption = 'Folders filter'
|
||||
Enabled = False
|
||||
TabOrder = 1
|
||||
OnEnter = textinputEnter
|
||||
end
|
||||
object deffileBox: TLabeledEdit
|
||||
Left = 10
|
||||
Top = 125
|
||||
Width = 365
|
||||
Height = 21
|
||||
Hint =
|
||||
'When a folder is browsed, the default file mask is used to find ' +
|
||||
'a file to serve in place of the folder page. If no file is found' +
|
||||
', the folder page is served.'
|
||||
Anchors = [akLeft, akTop, akRight]
|
||||
EditLabel.Width = 79
|
||||
EditLabel.Height = 13
|
||||
EditLabel.Caption = 'Default file mask'
|
||||
Enabled = False
|
||||
TabOrder = 2
|
||||
OnEnter = textinputEnter
|
||||
end
|
||||
object uploadfilterBox: TLabeledEdit
|
||||
Left = 10
|
||||
Top = 171
|
||||
Width = 365
|
||||
Height = 21
|
||||
Hint = 'Uploaded files are allowed only complying with this file mask'
|
||||
Anchors = [akLeft, akTop, akRight]
|
||||
EditLabel.Width = 85
|
||||
EditLabel.Height = 13
|
||||
EditLabel.Caption = 'Upload filter mask'
|
||||
Enabled = False
|
||||
TabOrder = 3
|
||||
OnEnter = textinputEnter
|
||||
end
|
||||
object dontconsiderBox: TLabeledEdit
|
||||
Left = 10
|
||||
Top = 218
|
||||
Width = 365
|
||||
Height = 21
|
||||
Hint =
|
||||
'Files matching this filemask are not considered for global downl' +
|
||||
'oads counter. Moreover they never get tray icon.'
|
||||
Anchors = [akLeft, akTop, akRight]
|
||||
EditLabel.Width = 166
|
||||
EditLabel.Height = 13
|
||||
EditLabel.Caption = 'Don'#39't consider as download (mask)'
|
||||
Enabled = False
|
||||
TabOrder = 4
|
||||
OnEnter = textinputEnter
|
||||
end
|
||||
end
|
||||
object otherTab: TTabSheet
|
||||
Caption = 'Other'
|
||||
ImageIndex = 5
|
||||
DesignSize = (
|
||||
385
|
||||
338)
|
||||
object Label1: TLabel
|
||||
Left = 10
|
||||
Top = 72
|
||||
Width = 21
|
||||
Height = 13
|
||||
Caption = 'Icon'
|
||||
FocusControl = iconBox
|
||||
end
|
||||
object realmBox: TLabeledEdit
|
||||
Left = 10
|
||||
Top = 32
|
||||
Width = 365
|
||||
Height = 21
|
||||
Hint =
|
||||
'The realm string is shown on the user/pass dialog of the browser' +
|
||||
'. This realm will be used for selected files and their descendan' +
|
||||
'ts.'
|
||||
Anchors = [akLeft, akTop, akRight]
|
||||
EditLabel.Width = 29
|
||||
EditLabel.Height = 13
|
||||
EditLabel.Caption = 'Realm'
|
||||
Enabled = False
|
||||
TabOrder = 0
|
||||
OnEnter = textinputEnter
|
||||
end
|
||||
object iconBox: TComboBoxEx
|
||||
Left = 10
|
||||
Top = 91
|
||||
Width = 127
|
||||
Height = 22
|
||||
ItemsEx = <>
|
||||
Style = csExDropDownList
|
||||
ItemHeight = 16
|
||||
TabOrder = 1
|
||||
Images = mainFrm.images
|
||||
end
|
||||
object addiconBtn: TButton
|
||||
Left = 152
|
||||
Top = 91
|
||||
Width = 75
|
||||
Height = 22
|
||||
Caption = 'Add new...'
|
||||
TabOrder = 2
|
||||
OnClick = addiconBtnClick
|
||||
end
|
||||
end
|
||||
end
|
||||
object Panel1: TPanel
|
||||
Left = 0
|
||||
Top = 366
|
||||
Width = 393
|
||||
Height = 35
|
||||
Align = alBottom
|
||||
BevelOuter = bvNone
|
||||
TabOrder = 1
|
||||
DesignSize = (
|
||||
393
|
||||
35)
|
||||
object okBtn: TButton
|
||||
Left = 152
|
||||
Top = 6
|
||||
Width = 75
|
||||
Height = 25
|
||||
Anchors = [akTop, akRight]
|
||||
Caption = '&OK'
|
||||
Default = True
|
||||
ModalResult = 1
|
||||
TabOrder = 0
|
||||
end
|
||||
object cancelBtn: TButton
|
||||
Left = 313
|
||||
Top = 6
|
||||
Width = 75
|
||||
Height = 25
|
||||
Anchors = [akTop, akRight]
|
||||
Caption = 'Cancel'
|
||||
ModalResult = 2
|
||||
TabOrder = 1
|
||||
end
|
||||
object applyBtn: TButton
|
||||
Left = 232
|
||||
Top = 6
|
||||
Width = 75
|
||||
Height = 25
|
||||
Anchors = [akTop, akRight]
|
||||
Caption = '&Apply'
|
||||
TabOrder = 2
|
||||
OnClick = applyBtnClick
|
||||
end
|
||||
end
|
||||
end
|
||||
521
filepropDlg.pas
Normal file
521
filepropDlg.pas
Normal file
@ -0,0 +1,521 @@
|
||||
unit filepropDlg;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, ComCtrls, StdCtrls, ExtCtrls, CheckLst, utilLib, main, types, Grids,
|
||||
ValEdit, strutils, hslib, math;
|
||||
|
||||
type
|
||||
TfilepropFrm = class(TForm)
|
||||
pages: TPageControl;
|
||||
permTab: TTabSheet;
|
||||
flagsTab: TTabSheet;
|
||||
diffTab: TTabSheet;
|
||||
commentTab: TTabSheet;
|
||||
maskTab: TTabSheet;
|
||||
hiddenChk: TCheckBox;
|
||||
hidetreeChk: TCheckBox;
|
||||
archivableChk: TCheckBox;
|
||||
browsableChk: TCheckBox;
|
||||
dontlogChk: TCheckBox;
|
||||
nodlChk: TCheckBox;
|
||||
dontconsiderChk: TCheckBox;
|
||||
hideemptyChk: TCheckBox;
|
||||
hideextChk: TCheckBox;
|
||||
Panel1: TPanel;
|
||||
okBtn: TButton;
|
||||
cancelBtn: TButton;
|
||||
difftplBox: TMemo;
|
||||
commentBox: TMemo;
|
||||
actionTabs: TTabControl;
|
||||
newaccBtn: TButton;
|
||||
anyAccChk: TCheckBox;
|
||||
anonChk: TCheckBox;
|
||||
allBtn: TButton;
|
||||
accountsBox: TListView;
|
||||
filesfilterBox: TLabeledEdit;
|
||||
foldersfilterBox: TLabeledEdit;
|
||||
deffileBox: TLabeledEdit;
|
||||
uploadfilterBox: TLabeledEdit;
|
||||
dontconsiderBox: TLabeledEdit;
|
||||
otherTab: TTabSheet;
|
||||
realmBox: TLabeledEdit;
|
||||
anyoneChk: TCheckBox;
|
||||
iconBox: TComboBoxEx;
|
||||
Label1: TLabel;
|
||||
addiconBtn: TButton;
|
||||
goToAccountsBtn: TButton;
|
||||
applyBtn: TButton;
|
||||
procedure accountsBoxGetImageIndex(Sender: TObject; Item: TListItem);
|
||||
procedure actionTabsChange(Sender: TObject);
|
||||
procedure newaccBtnClick(Sender: TObject);
|
||||
procedure allBtnClick(Sender: TObject);
|
||||
procedure accountsBoxChange(Sender: TObject; Item: TListItem; Change: TItemChange);
|
||||
procedure anonChkClick(Sender: TObject);
|
||||
procedure FormShow(Sender: TObject);
|
||||
procedure textinputEnter(Sender: TObject);
|
||||
procedure FormClose(Sender: TObject; var Action: TCloseAction);
|
||||
procedure FormKeyPress(Sender: TObject; var Key: Char);
|
||||
procedure addiconBtnClick(Sender: TObject);
|
||||
procedure goToAccountsBtnClick(Sender: TObject);
|
||||
procedure applyBtnClick(Sender: TObject);
|
||||
private
|
||||
iconOfs: integer;
|
||||
public
|
||||
firstActionChange: boolean;
|
||||
users: array [TfileAction] of TStringDynArray;
|
||||
savePerm: array [TfileAction] of boolean; // should we apply/save permissions for this TfileAction ?
|
||||
currAction, prevAction: TfileAction;
|
||||
procedure updateAccountsBox;
|
||||
end;
|
||||
|
||||
var
|
||||
filepropFrm: TfilepropFrm;
|
||||
|
||||
implementation
|
||||
|
||||
uses optionsDlg;
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
procedure TfilepropFrm.accountsBoxChange(Sender: TObject; Item: TListItem; Change: TItemChange);
|
||||
begin
|
||||
if (change = ctState)
|
||||
and (item.caption > '')
|
||||
and (stringExists(item.caption, users[currAction]) <> item.checked) then
|
||||
begin
|
||||
savePerm[currAction]:=TRUE;
|
||||
toggleString(item.caption, users[currAction])
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfilepropFrm.accountsBoxGetImageIndex(Sender: TObject; Item: TListItem);
|
||||
begin item.ImageIndex:=accountIcon(item.data) end;
|
||||
|
||||
function str2fileaction(s:string):TfileAction;
|
||||
begin
|
||||
for result:=low(result) to high(result) do
|
||||
if FILEACTION2STR[result] = s then
|
||||
exit;
|
||||
result:=TfileAction(-1);
|
||||
end; // str2fileaction
|
||||
|
||||
procedure TfilepropFrm.actionTabsChange(Sender: TObject);
|
||||
var
|
||||
l: TstringList;
|
||||
i: integer;
|
||||
ar: TstringDynArray;
|
||||
begin
|
||||
currAction:=str2fileaction(actionTabs.tabs[actionTabs.tabIndex]);
|
||||
if not firstActionChange then
|
||||
begin
|
||||
// we must save current selection before updating the checkmarks
|
||||
ar:=users[prevAction];
|
||||
// now 'ar' is actually an alias, no duplication
|
||||
setLength(ar, 0);
|
||||
if anonChk.checked then addString(USER_ANONYMOUS, ar);
|
||||
if anyAccChk.checked then addString(USER_ANY_ACCOUNT, ar);
|
||||
if anyoneChk.checked then addString(USER_ANYONE, ar);
|
||||
for i:=0 to accountsBox.Items.Count-1 do
|
||||
with accountsBox.Items[i] do
|
||||
if checked then
|
||||
addString(caption, ar);
|
||||
|
||||
prevAction:=currAction;
|
||||
end;
|
||||
firstActionChange:=FALSE;
|
||||
|
||||
l:=arrayToList(users[currAction]);
|
||||
try
|
||||
for i:=0 to accountsBox.Items.Count-1 do
|
||||
with accountsBox.Items[i] do
|
||||
checked:=l.IndexOf(caption) >= 0;
|
||||
anonChk.checked:=l.IndexOf(USER_ANONYMOUS) >= 0;
|
||||
anyAccChk.checked:=l.indexOf(USER_ANY_ACCOUNT) >= 0;
|
||||
anyoneChk.checked:=l.indexOf(USER_ANYONE) >= 0;
|
||||
finally l.free end;
|
||||
|
||||
end;
|
||||
|
||||
procedure TfilepropFrm.addiconBtnClick(Sender: TObject);
|
||||
var
|
||||
fn: string;
|
||||
i: integer;
|
||||
begin
|
||||
if not promptForFileName(fn) then exit;
|
||||
i:=getImageIndexForFile(fn);
|
||||
if i < 0 then exit;
|
||||
iconBox.itemsEx.addItem(idx_label(i), i, i, -1, 0, NIL);
|
||||
iconBox.itemIndex:=iconOfs+i;
|
||||
end;
|
||||
|
||||
procedure TfilepropFrm.FormClose(Sender: TObject; var Action: TCloseAction);
|
||||
begin
|
||||
if (action = caHide) and (modalResult = mrOk) then
|
||||
applyBtnClick(applyBtn);
|
||||
end;
|
||||
|
||||
procedure TfilepropFrm.FormKeyPress(Sender: TObject; var Key: Char);
|
||||
begin
|
||||
if pages.focused then
|
||||
if key in ['1'..'9'] then
|
||||
try pages.TabIndex:=ord(key)-ord('0')-1
|
||||
except end;
|
||||
end;
|
||||
|
||||
procedure TfilepropFrm.FormShow(Sender: TObject);
|
||||
var
|
||||
i: integer;
|
||||
f: Tfile;
|
||||
|
||||
procedure setFlag(flag:TfileAttribute; cb:TCheckBox);
|
||||
var
|
||||
should: TCheckBoxState;
|
||||
begin
|
||||
cb.enabled:=TRUE;
|
||||
if flag in f.flags then
|
||||
should:=cbChecked
|
||||
else
|
||||
should:=cbUnchecked;
|
||||
if i = 0 then
|
||||
cb.state:=should
|
||||
else
|
||||
if (cb.state <> cbGrayed) and (cb.state <> should) then
|
||||
cb.state:=cbGrayed;
|
||||
end; // setFlag
|
||||
|
||||
procedure setText(var v:string; box:TCustomEdit);
|
||||
const
|
||||
COLOR = clInfoBk;
|
||||
var
|
||||
n: integer;
|
||||
begin
|
||||
n:=countSubstr(#0, box.hint);
|
||||
box.enabled:=TRUE;
|
||||
if n = 0 then
|
||||
begin // init this edit box
|
||||
box.text:=v;
|
||||
box.hint:=box.hint+#0;
|
||||
exit;
|
||||
end;
|
||||
if (pos(#0+v+#0, box.hint) > 0)
|
||||
or (box.hint = #0) and (v = box.text) then
|
||||
exit; // the value is already there
|
||||
if n > 1 then
|
||||
begin // add the value to the list of values
|
||||
box.hint:=box.hint+v+#0;
|
||||
exit;
|
||||
end;
|
||||
box.hint:=box.hint+box.text+#0+v+#0; // init the list of values
|
||||
box.text:='(more values)'; // message to be shown
|
||||
// these properties are unhappily kept unaccessible through TcustomEdit interface
|
||||
try (box as Tlabelededit).color:=COLOR except end;
|
||||
try (box as Tmemo).color:=COLOR except end;
|
||||
end; // setText
|
||||
|
||||
procedure setCaption();
|
||||
const
|
||||
MAX = 2;
|
||||
var
|
||||
a: TStringDynArray;
|
||||
i: integer;
|
||||
begin
|
||||
a:=NIL;
|
||||
for i:=0 to min(mainFrm.filesBox.SelectionCount, MAX)-1 do
|
||||
addString(mainFrm.filesBox.Selections[i].Text, a);
|
||||
if mainFrm.filesBox.SelectionCount > MAX then
|
||||
addString('...', a);
|
||||
caption:='Properties for '+join(', ', a);
|
||||
end; // setCaption
|
||||
|
||||
var
|
||||
act: TfileAction;
|
||||
actions: set of TfileAction;
|
||||
begin
|
||||
firstActionChange:=TRUE;
|
||||
|
||||
accountsBox.smallImages:=mainfrm.images;
|
||||
updateAccountsBox();
|
||||
|
||||
maskTab.tabVisible:=FALSE;
|
||||
diffTab.tabVisible:=FALSE;
|
||||
|
||||
iconBox.clear();
|
||||
iconBox.Enabled:=FALSE;
|
||||
addiconBtn.Enabled:=FALSE;
|
||||
i:=if_(mainfrm.filesBox.SelectionCount > 1, -1, selectedFile.getIconForTreeview());
|
||||
iconBox.itemsEx.addItem('Default', i, i, -1, 0, NIL);
|
||||
iconOfs:=iconBox.ItemsEx.count;
|
||||
for i:=0 to mainfrm.images.Count-1 do
|
||||
iconBox.itemsEx.addItem(idx_label(i), i, i, -1, 0, NIL);
|
||||
|
||||
actions:=[FA_ACCESS];
|
||||
for i:=0 to mainFrm.filesBox.SelectionCount-1 do
|
||||
begin
|
||||
f:=mainFrm.filesBox.Selections[i].data;
|
||||
|
||||
setText(f.comment, commentBox);
|
||||
setText(f.realm, realmBox);
|
||||
|
||||
if f.isRealFolder() then
|
||||
begin
|
||||
include(actions, FA_UPLOAD);
|
||||
setText(f.uploadFilterMask, uploadfilterBox);
|
||||
end;
|
||||
|
||||
if f.isFileOrFolder() then
|
||||
setFlag(FA_DONT_LOG, dontlogChk);
|
||||
|
||||
if f.isFile() or f.isRealFolder() then
|
||||
setFlag(FA_DL_FORBIDDEN, nodlChk);
|
||||
|
||||
if not f.isRoot() then
|
||||
begin
|
||||
setFlag(FA_HIDDEN, hiddenChk);
|
||||
if not iconBox.enabled then
|
||||
begin
|
||||
iconBox.enabled:=TRUE;
|
||||
iconBox.itemIndex:=f.icon+iconOfs;
|
||||
addiconBtn.Enabled:=TRUE;
|
||||
end
|
||||
else
|
||||
if iconBox.itemIndex <> f.icon+iconOfs then
|
||||
iconBox.itemIndex:=-1;
|
||||
end;
|
||||
|
||||
if f.isFile() then
|
||||
setFlag(FA_DONT_COUNT_AS_DL, dontconsiderChk);
|
||||
|
||||
if f.isFolder() then
|
||||
begin
|
||||
include(actions, FA_DELETE);
|
||||
|
||||
diffTab.tabVisible:=TRUE;
|
||||
maskTab.tabVisible:=TRUE;
|
||||
setText(f.filesFilter, filesfilterBox);
|
||||
setText(f.foldersFilter, foldersfilterBox);
|
||||
setText(f.defaultFileMask, deffileBox);
|
||||
setText(f.dontCountAsDownloadMask, dontconsiderBox);
|
||||
setText(f.diffTpl, difftplBox);
|
||||
|
||||
setFlag(FA_HIDDENTREE, hidetreeChk);
|
||||
setFlag(FA_HIDE_EXT, hideextChk);
|
||||
setFlag(FA_BROWSABLE, browsableChk);
|
||||
setFlag(FA_ARCHIVABLE, archivableChk);
|
||||
setFlag(FA_HIDE_EMPTY_FOLDERS, hideemptyChk);
|
||||
|
||||
end;
|
||||
|
||||
// collect usernames
|
||||
for act:=low(act) to high(act) do
|
||||
addUniqueArray(users[act], f.accounts[act]);
|
||||
end;
|
||||
|
||||
for act:=low(act) to high(act) do
|
||||
begin
|
||||
savePerm[act]:=FALSE;
|
||||
if act in actions then
|
||||
actionTabs.tabs.add(FILEACTION2STR[act]);
|
||||
end;
|
||||
|
||||
if easyMode then
|
||||
onlyForExperts([browsableChk, commentTab, realmBox, dontconsiderChk, maskTab, dontlogChk, hideextChk]);
|
||||
|
||||
actionTabs.tabIndex:=0;
|
||||
actionTabsChange(NIL);
|
||||
setCaption();
|
||||
pages.TabIndex:=0;
|
||||
end;
|
||||
|
||||
procedure TfilepropFrm.goToAccountsBtnClick(Sender: TObject);
|
||||
begin
|
||||
showOptions(optionsFrm.accountsPage);
|
||||
updateAccountsBox();
|
||||
actionTabsChange(NIL);
|
||||
end;
|
||||
|
||||
procedure TfilepropFrm.allBtnClick(Sender: TObject);
|
||||
var
|
||||
i: integer;
|
||||
b: boolean;
|
||||
begin
|
||||
if accountsBox.items.Count = 0 then exit;
|
||||
with accountsBox.Items[0] do
|
||||
begin
|
||||
b:=not checked;
|
||||
checked:=b;
|
||||
end;
|
||||
for i:=1 to accountsBox.items.count-1 do
|
||||
accountsBox.Items[i].checked:=b;
|
||||
end;
|
||||
|
||||
procedure TfilepropFrm.anonChkClick(Sender: TObject);
|
||||
var
|
||||
s: string;
|
||||
begin
|
||||
savePerm[currAction]:=TRUE;
|
||||
if sender = anonChk then s:=USER_ANONYMOUS
|
||||
else if sender = anyAccChk then
|
||||
begin
|
||||
s:=USER_ANY_ACCOUNT;
|
||||
accountsBox.enabled:=not anyAccChk.Checked;
|
||||
end
|
||||
else if sender = anyoneChk then
|
||||
begin
|
||||
s:=USER_ANYONE;
|
||||
accountsBox.enabled:=not anyoneChk.Checked;
|
||||
anonChk.enabled:=accountsBox.enabled;
|
||||
anyAccChk.enabled:=accountsBox.enabled;
|
||||
newaccBtn.Enabled:=accountsBox.enabled;
|
||||
end;
|
||||
allBtn.Enabled:=accountsBox.enabled;
|
||||
with sender as Tcheckbox do
|
||||
if checked then addUniqueString(s, users[currAction])
|
||||
else removeString(s, users[currAction]);
|
||||
end;
|
||||
|
||||
procedure TfilepropFrm.applyBtnClick(Sender: TObject);
|
||||
var
|
||||
i: integer;
|
||||
f: Tfile;
|
||||
act: TfileAction;
|
||||
|
||||
procedure applyFlag(flag:TfileAttribute; cb:TCheckBox);
|
||||
begin
|
||||
if (cb.State = cbGrayed)
|
||||
or not cb.Enabled
|
||||
or not cb.Visible then exit;
|
||||
|
||||
if cb.Checked then include(f.flags, flag)
|
||||
else exclude(f.flags, flag);
|
||||
end; // applyFlag
|
||||
|
||||
procedure applyText(var v:string; box:TCustomEdit);
|
||||
begin
|
||||
if box.modified then
|
||||
v:=box.Text;
|
||||
end; // applyText
|
||||
|
||||
begin
|
||||
for act:=low(act) to high(act) do
|
||||
sortArray(users[act]);
|
||||
|
||||
for i:=0 to mainFrm.filesBox.SelectionCount-1 do
|
||||
begin
|
||||
f:=mainFrm.filesBox.Selections[i].data;
|
||||
|
||||
for act:=low(act) to high(act) do
|
||||
if savePerm[act]
|
||||
and ((act <> FA_UPLOAD) or f.isRealFolder())
|
||||
and ((act <> FA_DELETE) or f.isFolder()) then
|
||||
begin
|
||||
|
||||
// The following is because we monitor every upload path
|
||||
if (act = FA_UPLOAD)
|
||||
and ((f.accounts[act] = NIL) <> (users[act] = NIL)) then // something has changed
|
||||
// WARNING: toggleString() can't be used here, it's not equivalent
|
||||
if users[act] <> NIL then addString(f.resource, uploadPaths)
|
||||
else removeString(f.resource, uploadPaths);
|
||||
|
||||
f.accounts[act]:=users[act];
|
||||
end;
|
||||
|
||||
applyText(f.comment, commentBox);
|
||||
applyText(f.realm, realmBox);
|
||||
|
||||
if f.isFile() then
|
||||
applyFlag(FA_DONT_COUNT_AS_DL, dontconsiderChk);
|
||||
|
||||
if f.isFolder() then
|
||||
begin
|
||||
applyText(f.diffTpl, difftplBox);
|
||||
applyText(f.filesFilter, filesfilterBox);
|
||||
applyText(f.foldersFilter, foldersfilterBox);
|
||||
applyText(f.defaultFileMask, deffileBox);
|
||||
applyText(f.dontCountAsDownloadMask, dontconsiderBox);
|
||||
|
||||
applyFlag(FA_HIDDENTREE, hidetreeChk);
|
||||
applyFlag(FA_HIDE_EXT, hideextChk);
|
||||
applyFlag(FA_HIDE_EMPTY_FOLDERS, hideemptyChk);
|
||||
applyFlag(FA_BROWSABLE, browsableChk);
|
||||
applyFlag(FA_ARCHIVABLE, archivableChk);
|
||||
end;
|
||||
|
||||
if not f.isRoot() then
|
||||
begin
|
||||
applyFlag(FA_HIDDEN, hiddenChk);
|
||||
if iconBox.itemIndex > -1 then
|
||||
f.setupImage(iconBox.itemIndex-iconOfs);
|
||||
end;
|
||||
|
||||
if f.isRealFolder() then
|
||||
applyText(f.uploadFilterMask, uploadfilterBox);
|
||||
|
||||
if f.isFileOrFolder() then
|
||||
applyFlag(FA_DONT_LOG, dontlogChk);
|
||||
|
||||
if f.isFile() or f.isRealFolder() then
|
||||
applyFlag(FA_DL_FORBIDDEN, nodlChk);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfilepropFrm.newaccBtnClick(Sender: TObject);
|
||||
var
|
||||
acc: Paccount;
|
||||
begin
|
||||
acc:=createAccountOnTheFly();
|
||||
if acc = NIL then exit;
|
||||
with accountsBox.Items.add() do
|
||||
begin
|
||||
caption:=acc.user;
|
||||
data:=acc;
|
||||
checked:=TRUE;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfilepropFrm.textinputEnter(Sender: TObject);
|
||||
|
||||
function chooseValue(var s:string):boolean;
|
||||
var
|
||||
l: string;
|
||||
begin
|
||||
l:=s;
|
||||
repeat s:=chop(#0, l)
|
||||
until (s > '') or (l = '');
|
||||
result:=TRUE;
|
||||
end; // chooseValue
|
||||
|
||||
var
|
||||
box: TcustomEdit;
|
||||
s, h: string;
|
||||
begin
|
||||
box:=sender as TcustomEdit;
|
||||
if countSubstr(#0, box.hint) < 2 then exit;
|
||||
|
||||
s:=box.hint;
|
||||
h:=chop(#0, s);
|
||||
if not chooseValue(s) then exit;
|
||||
box.text:=s;
|
||||
box.hint:=h;
|
||||
// these properties are unhappily kept unaccessible through TcustomEdit interface
|
||||
try (box as Tlabelededit).color:=clWindow except end;
|
||||
try (box as Tmemo).color:=clWindow except end;
|
||||
end;
|
||||
|
||||
procedure TfilepropFrm.updateAccountsBox;
|
||||
var
|
||||
i: integer;
|
||||
a: Paccount;
|
||||
begin
|
||||
accountsBox.clear();
|
||||
for i:=0 to length(accounts)-1 do
|
||||
begin
|
||||
a:=@accounts[i];
|
||||
if not a.enabled then continue;
|
||||
accountsBox.addItem(a.user, Tobject(a));
|
||||
end;
|
||||
end; // updateAccountsBox
|
||||
|
||||
end.
|
||||
145
folderKindDlg.dfm
Normal file
145
folderKindDlg.dfm
Normal file
@ -0,0 +1,145 @@
|
||||
object folderKindFrm: TfolderKindFrm
|
||||
Left = 257
|
||||
Top = 199
|
||||
BorderIcons = [biSystemMenu, biMinimize]
|
||||
BorderStyle = bsDialog
|
||||
Caption = 'What kind of folder do you want?'
|
||||
ClientHeight = 206
|
||||
ClientWidth = 367
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
Position = poMainFormCenter
|
||||
OnCreate = FormCreate
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object realLbl: TLabel
|
||||
Left = 136
|
||||
Top = 40
|
||||
Width = 191
|
||||
Height = 13
|
||||
Caption = 'A real folder is faster, good for big folders'
|
||||
end
|
||||
object virtuaLbl: TLabel
|
||||
Left = 136
|
||||
Top = 96
|
||||
Width = 213
|
||||
Height = 13
|
||||
Caption = 'A virtual folder is easier, good for small folders'
|
||||
WordWrap = True
|
||||
end
|
||||
object Label3: TLabel
|
||||
Left = 48
|
||||
Top = 128
|
||||
Width = 28
|
||||
Height = 63
|
||||
Caption = '?'
|
||||
Font.Charset = ANSI_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -56
|
||||
Font.Name = 'Times New Roman'
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object hintLbl: TLabel
|
||||
Left = 80
|
||||
Top = 152
|
||||
Width = 201
|
||||
Height = 33
|
||||
AutoSize = False
|
||||
Caption = 'Not sure? Hint: most time you need real folders!'
|
||||
end
|
||||
object realBtn: TBitBtn
|
||||
Left = 20
|
||||
Top = 34
|
||||
Width = 107
|
||||
Height = 25
|
||||
Caption = '&Real folder'
|
||||
Default = True
|
||||
ModalResult = 7
|
||||
TabOrder = 0
|
||||
Glyph.Data = {
|
||||
36040000424D3604000000000000360000002800000010000000100000000100
|
||||
2000000000000004000000000000000000000000000000000000FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF006D6DED001B1BC9001B1BC9003838E6007676EE00B2B2F600FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF006161EB008383EF006565EB004343E7001E1EDE001919BD001A1AC0002828
|
||||
E4006565EB00A4A4F400FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF004848E8009494F2008686F0008686F0008686F0008686F0007C7CEE005A5A
|
||||
EA002C2CE4001B1BCD001919BB009393F100FF00FF00FF00FF00FF00FF00FF00
|
||||
FF002727E3009A9AF2008D8DF1008D8DF1008D8DF1008D8DF1008D8DF1008D8D
|
||||
F1008D8DF1008D8DF1003838E6005353E900FF00FF00FF00FF00FF00FF00FF00
|
||||
FF003131E500B1B1F5009696F2009696F2009696F2009696F2009696F2009696
|
||||
F2009696F2009696F2005E5EEA003535E500FF00FF00FF00FF00FF00FF00FF00
|
||||
FF002727E300B1B1F5009F9FF3009F9FF3009F9FF3009F9FF3009F9FF3009F9F
|
||||
F3009F9FF3009F9FF3007878EE001D1DDB00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF004848E800A4A4F400A4A4F400A4A4F400A4A4F400A4A4F400A4A4F400A4A4
|
||||
F400A4A4F400A4A4F4009494F2001A1AC600FF00FF00FF00FF00FF00FF00FF00
|
||||
FF005E5EEA00AFAFF500C6C6F800C1C1F700BBBBF700BBBBF700BBBBF700BBBB
|
||||
F700BBBBF700BBBBF700ABABF5001B1BCB00FF00FF00FF00FF00FF00FF00D9D9
|
||||
FB008F8FF1006161EB006D6DED006F6FED009191F100D9D9FB00D1D1F900D2D2
|
||||
FA00D1D1F900D2D2FA00BBBBF7001E1EE200B4B4F600FF00FF00FF00FF00D9D9
|
||||
FB00B1B1F500A4A4F400A4A4F400A4A4F4008686F0006C6CEC009898F200BABA
|
||||
F600DDDDFB00EDEDFD00CFCFF9003C3CE6009F9FF300FF00FF00FF00FF00FF00
|
||||
FF00A1A1F300A4A4F400A4A4F400A4A4F400B2B2F6009191F1009494F2009494
|
||||
F2008686F0007171ED005151E9006161EB00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00A8A8F4009B9BF300A4A4F400B6B6F6007F7FEF00E4E4FC00FF00FF00CDCD
|
||||
F900AAAAF400ABABF500B4B4F600FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00D9D9FB00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00}
|
||||
end
|
||||
object virtuaBtn: TBitBtn
|
||||
Left = 20
|
||||
Top = 90
|
||||
Width = 107
|
||||
Height = 25
|
||||
Caption = '&Virtual folder'
|
||||
ModalResult = 6
|
||||
TabOrder = 1
|
||||
Glyph.Data = {
|
||||
36040000424D3604000000000000360000002800000010000000100000000100
|
||||
2000000000000004000000000000000000000000000000000000FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF0086BED40049869B005A7E89008D8F9100B1B2B100D6D1D100FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF006AC3E20075DCFD005BCAF40043BCE70035A1C7003587A0004C7C8E008089
|
||||
8C00A8A8A800CCCCCB00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF0052B9DD0087E1FE0078DEFD0078DEFD0078DEFD0078DEFD006FD8FB0056C8
|
||||
EE0043A9CD003C8FAB0049798A00C1C2C100FF00FF00FF00FF00FF00FF00FF00
|
||||
FF0031ADD9008DE6FE0080E6FE0080E6FE0080E6FE0080E6FE0080E6FE0080E6
|
||||
FE0080E6FE0080E6FE003FB7DE009D9E9E00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF003CB1D900A8F2FE0088EFFF0088EFFF0088EFFF0088EFFF0088EFFF0088EF
|
||||
FF0088EFFF0088EFFF0059CBEF0087919300FF00FF00FF00FF00FF00FF00FF00
|
||||
FF0031ADD900A7F8FE0093F8FF0093F8FF0093F8FF0093F8FF0093F8FF0093F8
|
||||
FF0093F8FF0093F8FF006ED8F80067859000FF00FF00FF00FF00FF00FF00FF00
|
||||
FF004CBAE300A2EDF60099FDFF0099FDFF0099FDFF0099FDFF0099FDFF0099FD
|
||||
FF0099FDFF0099FDFF0088E8FE004E7F9100FF00FF00FF00FF00FF00FF00FF00
|
||||
FF0065C1E200B0E8F400C0FCFE00B9FCFE00B3FDFF00B3FDFF00B3FDFF00B3FD
|
||||
FF00B3FDFF00B3FDFF00A1F3FF004A859B00FF00FF00FF00FF00FF00FF00DBEF
|
||||
F8008CE0F3005ED4ED006CCFED0074CDE80093D9EE00D6FBFD00CBFCFE00CDFB
|
||||
FE00CBFCFE00CDFBFE00B3F1FE005A93A600D4D4D500FF00FF00FF00FF00DBEF
|
||||
F800AFEDF60099FDFF0099FDFF0099FDFF0080ECF60072CBE5009CDBEE00BBEA
|
||||
F500DDF6FB00ECFDFE00CAF3FD0061A5C000C9C9C800FF00FF00FF00FF00FF00
|
||||
FF00A5DDEF0099FDFF0099FDFF0099FDFF00AFF1F90099D9E90093DFF20094DB
|
||||
F20089D8ED0074D4EA0062B9D8007ABAD200FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00ADDDEF00A0DBED00A6E3F200B5ECF60098C3D500F0F0F000FF00FF00D0EB
|
||||
F600AFDEEE00B0DFF000BEE0EC00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00DBEFF800FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
|
||||
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00}
|
||||
end
|
||||
end
|
||||
34
folderKindDlg.pas
Normal file
34
folderKindDlg.pas
Normal file
@ -0,0 +1,34 @@
|
||||
unit folderKindDlg;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, StdCtrls, Buttons, strUtils, ExtCtrls;
|
||||
|
||||
type
|
||||
TfolderKindFrm = class(TForm)
|
||||
realLbl: TLabel;
|
||||
virtuaLbl: TLabel;
|
||||
realBtn: TBitBtn;
|
||||
virtuaBtn: TBitBtn;
|
||||
Label3: TLabel;
|
||||
hintLbl: TLabel;
|
||||
procedure FormCreate(Sender: TObject);
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
procedure TfolderKindFrm.FormCreate(Sender: TObject);
|
||||
begin
|
||||
realBtn.Font.Style:=[fsBold];
|
||||
with hintLbl do caption:=ansiReplaceStr(caption,'? ','?'#13);
|
||||
end;
|
||||
|
||||
end.
|
||||
184
hfs.bdsproj
Normal file
184
hfs.bdsproj
Normal file
@ -0,0 +1,184 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<BorlandProject>
|
||||
<PersonalityInfo>
|
||||
<Option>
|
||||
<Option Name="Personality">Delphi.Personality</Option>
|
||||
<Option Name="ProjectType">VCLApplication</Option>
|
||||
<Option Name="Version">1.0</Option>
|
||||
<Option Name="GUID">{3BBE6A58-B0E7-4454-B009-5B21EFD56A84}</Option>
|
||||
</Option>
|
||||
</PersonalityInfo>
|
||||
<Delphi.Personality>
|
||||
<Source>
|
||||
<Source Name="MainSource">hfs.dpr</Source>
|
||||
</Source>
|
||||
<FileVersion>
|
||||
<FileVersion Name="Version">7.0</FileVersion>
|
||||
</FileVersion>
|
||||
<Compiler>
|
||||
<Compiler Name="A">8</Compiler>
|
||||
<Compiler Name="B">0</Compiler>
|
||||
<Compiler Name="C">1</Compiler>
|
||||
<Compiler Name="D">1</Compiler>
|
||||
<Compiler Name="E">0</Compiler>
|
||||
<Compiler Name="F">0</Compiler>
|
||||
<Compiler Name="G">1</Compiler>
|
||||
<Compiler Name="H">1</Compiler>
|
||||
<Compiler Name="I">1</Compiler>
|
||||
<Compiler Name="J">0</Compiler>
|
||||
<Compiler Name="K">0</Compiler>
|
||||
<Compiler Name="L">1</Compiler>
|
||||
<Compiler Name="M">0</Compiler>
|
||||
<Compiler Name="N">1</Compiler>
|
||||
<Compiler Name="O">1</Compiler>
|
||||
<Compiler Name="P">1</Compiler>
|
||||
<Compiler Name="Q">0</Compiler>
|
||||
<Compiler Name="R">0</Compiler>
|
||||
<Compiler Name="S">0</Compiler>
|
||||
<Compiler Name="T">0</Compiler>
|
||||
<Compiler Name="U">0</Compiler>
|
||||
<Compiler Name="V">1</Compiler>
|
||||
<Compiler Name="W">1</Compiler>
|
||||
<Compiler Name="X">1</Compiler>
|
||||
<Compiler Name="Y">2</Compiler>
|
||||
<Compiler Name="Z">1</Compiler>
|
||||
<Compiler Name="ShowHints">True</Compiler>
|
||||
<Compiler Name="ShowWarnings">True</Compiler>
|
||||
<Compiler Name="UnitAliases">WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;</Compiler>
|
||||
<Compiler Name="NamespacePrefix"></Compiler>
|
||||
<Compiler Name="GenerateDocumentation">False</Compiler>
|
||||
<Compiler Name="DefaultNamespace"></Compiler>
|
||||
<Compiler Name="SymbolDeprecated">True</Compiler>
|
||||
<Compiler Name="SymbolLibrary">True</Compiler>
|
||||
<Compiler Name="SymbolPlatform">True</Compiler>
|
||||
<Compiler Name="SymbolExperimental">True</Compiler>
|
||||
<Compiler Name="UnitLibrary">True</Compiler>
|
||||
<Compiler Name="UnitPlatform">True</Compiler>
|
||||
<Compiler Name="UnitDeprecated">True</Compiler>
|
||||
<Compiler Name="UnitExperimental">True</Compiler>
|
||||
<Compiler Name="HResultCompat">True</Compiler>
|
||||
<Compiler Name="HidingMember">True</Compiler>
|
||||
<Compiler Name="HiddenVirtual">True</Compiler>
|
||||
<Compiler Name="Garbage">True</Compiler>
|
||||
<Compiler Name="BoundsError">True</Compiler>
|
||||
<Compiler Name="ZeroNilCompat">True</Compiler>
|
||||
<Compiler Name="StringConstTruncated">True</Compiler>
|
||||
<Compiler Name="ForLoopVarVarPar">True</Compiler>
|
||||
<Compiler Name="TypedConstVarPar">True</Compiler>
|
||||
<Compiler Name="AsgToTypedConst">True</Compiler>
|
||||
<Compiler Name="CaseLabelRange">True</Compiler>
|
||||
<Compiler Name="ForVariable">True</Compiler>
|
||||
<Compiler Name="ConstructingAbstract">True</Compiler>
|
||||
<Compiler Name="ComparisonFalse">True</Compiler>
|
||||
<Compiler Name="ComparisonTrue">True</Compiler>
|
||||
<Compiler Name="ComparingSignedUnsigned">True</Compiler>
|
||||
<Compiler Name="CombiningSignedUnsigned">True</Compiler>
|
||||
<Compiler Name="UnsupportedConstruct">True</Compiler>
|
||||
<Compiler Name="FileOpen">True</Compiler>
|
||||
<Compiler Name="FileOpenUnitSrc">True</Compiler>
|
||||
<Compiler Name="BadGlobalSymbol">True</Compiler>
|
||||
<Compiler Name="DuplicateConstructorDestructor">True</Compiler>
|
||||
<Compiler Name="InvalidDirective">True</Compiler>
|
||||
<Compiler Name="PackageNoLink">True</Compiler>
|
||||
<Compiler Name="PackageThreadVar">True</Compiler>
|
||||
<Compiler Name="ImplicitImport">True</Compiler>
|
||||
<Compiler Name="HPPEMITIgnored">True</Compiler>
|
||||
<Compiler Name="NoRetVal">True</Compiler>
|
||||
<Compiler Name="UseBeforeDef">True</Compiler>
|
||||
<Compiler Name="ForLoopVarUndef">True</Compiler>
|
||||
<Compiler Name="UnitNameMismatch">True</Compiler>
|
||||
<Compiler Name="NoCFGFileFound">True</Compiler>
|
||||
<Compiler Name="ImplicitVariants">True</Compiler>
|
||||
<Compiler Name="UnicodeToLocale">True</Compiler>
|
||||
<Compiler Name="LocaleToUnicode">True</Compiler>
|
||||
<Compiler Name="ImagebaseMultiple">True</Compiler>
|
||||
<Compiler Name="SuspiciousTypecast">True</Compiler>
|
||||
<Compiler Name="PrivatePropAccessor">True</Compiler>
|
||||
<Compiler Name="UnsafeType">False</Compiler>
|
||||
<Compiler Name="UnsafeCode">False</Compiler>
|
||||
<Compiler Name="UnsafeCast">False</Compiler>
|
||||
<Compiler Name="OptionTruncated">True</Compiler>
|
||||
<Compiler Name="WideCharReduced">True</Compiler>
|
||||
<Compiler Name="DuplicatesIgnored">True</Compiler>
|
||||
<Compiler Name="UnitInitSeq">True</Compiler>
|
||||
<Compiler Name="LocalPInvoke">True</Compiler>
|
||||
<Compiler Name="MessageDirective">True</Compiler>
|
||||
<Compiler Name="CodePage"></Compiler>
|
||||
</Compiler>
|
||||
<Linker>
|
||||
<Linker Name="MapFile">3</Linker>
|
||||
<Linker Name="OutputObjs">0</Linker>
|
||||
<Linker Name="GenerateHpps">False</Linker>
|
||||
<Linker Name="ConsoleApp">1</Linker>
|
||||
<Linker Name="DebugInfo">False</Linker>
|
||||
<Linker Name="RemoteSymbols">False</Linker>
|
||||
<Linker Name="GenerateDRC">False</Linker>
|
||||
<Linker Name="MinStackSize">16384</Linker>
|
||||
<Linker Name="MaxStackSize">1048576</Linker>
|
||||
<Linker Name="ImageBase">4194304</Linker>
|
||||
<Linker Name="ExeDescription">HFS ~ HTTP File Server - www.rejetto.com/hfs</Linker>
|
||||
</Linker>
|
||||
<Directories>
|
||||
<Directories Name="OutputDir"></Directories>
|
||||
<Directories Name="UnitOutputDir"></Directories>
|
||||
<Directories Name="PackageDLLOutputDir"></Directories>
|
||||
<Directories Name="PackageDCPOutputDir"></Directories>
|
||||
<Directories Name="SearchPath">$(DELPHI)\Lib\Debug;C:\code\other\jcl\source\include</Directories>
|
||||
<Directories Name="Packages">vcl;rtl;vclx;VclSmp;DJCL60;IcsDel60</Directories>
|
||||
<Directories Name="Conditionals"></Directories>
|
||||
<Directories Name="DebugSourceDirs">C:\code\other\ics\Delphi\Vc32\</Directories>
|
||||
<Directories Name="UsePackages">False</Directories>
|
||||
</Directories>
|
||||
<Parameters>
|
||||
<Parameters Name="RunParams"></Parameters>
|
||||
<Parameters Name="HostApplication"></Parameters>
|
||||
<Parameters Name="Launcher"></Parameters>
|
||||
<Parameters Name="UseLauncher">False</Parameters>
|
||||
<Parameters Name="DebugCWD"></Parameters>
|
||||
<Parameters Name="Debug Symbols Search Path"></Parameters>
|
||||
<Parameters Name="LoadAllSymbols">True</Parameters>
|
||||
<Parameters Name="LoadUnspecifiedSymbols">False</Parameters>
|
||||
</Parameters>
|
||||
<Language>
|
||||
<Language Name="ActiveLang"></Language>
|
||||
<Language Name="ProjectLang">$00000000</Language>
|
||||
<Language Name="RootDir"></Language>
|
||||
</Language>
|
||||
<VersionInfo>
|
||||
<VersionInfo Name="IncludeVerInfo">True</VersionInfo>
|
||||
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
|
||||
<VersionInfo Name="MajorVer">2</VersionInfo>
|
||||
<VersionInfo Name="MinorVer">3</VersionInfo>
|
||||
<VersionInfo Name="Release">0</VersionInfo>
|
||||
<VersionInfo Name="Build">0</VersionInfo>
|
||||
<VersionInfo Name="Debug">True</VersionInfo>
|
||||
<VersionInfo Name="PreRelease">False</VersionInfo>
|
||||
<VersionInfo Name="Special">False</VersionInfo>
|
||||
<VersionInfo Name="Private">False</VersionInfo>
|
||||
<VersionInfo Name="DLL">False</VersionInfo>
|
||||
<VersionInfo Name="Locale">1040</VersionInfo>
|
||||
<VersionInfo Name="CodePage">1252</VersionInfo>
|
||||
</VersionInfo>
|
||||
<VersionInfoKeys>
|
||||
<VersionInfoKeys Name="CompanyName">rejetto</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="FileDescription"></VersionInfoKeys>
|
||||
<VersionInfoKeys Name="FileVersion">2.4.0.0</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="InternalName">HFS</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="LegalCopyright">Copyright (C) 2002 Massimo Melina (www.rejetto.com)</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys>
|
||||
<VersionInfoKeys Name="OriginalFilename">hfs.exe</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="ProductName">Http File Server</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="ProductVersion">2.4</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="Comments"></VersionInfoKeys>
|
||||
</VersionInfoKeys>
|
||||
|
||||
<Excluded_Packages>
|
||||
<Excluded_Packages Name="c:\program files (x86)\borland\bds\4.0\Bin\dclib100.bpl">Borland InterBase Express Components</Excluded_Packages>
|
||||
<Excluded_Packages Name="c:\program files (x86)\borland\bds\4.0\Bin\dclIntraweb_80_100.bpl">Intraweb 8.0 Design Package for Borland Development Studio 2006</Excluded_Packages>
|
||||
<Excluded_Packages Name="c:\program files (x86)\borland\bds\4.0\Bin\dclIndyCore100.bpl">Indy 10 Core Design Time</Excluded_Packages>
|
||||
<Excluded_Packages Name="c:\program files (x86)\borland\bds\4.0\Bin\dclsmp100.bpl">Borland Sample Components</Excluded_Packages>
|
||||
<Excluded_Packages Name="c:\program files (x86)\borland\bds\4.0\Bin\dclIndyProtocols100.bpl">Indy 10 Protocols Design Time</Excluded_Packages>
|
||||
<Excluded_Packages Name="c:\program files (x86)\borland\bds\4.0\Bin\dcltee100.bpl">TeeChart Components</Excluded_Packages>
|
||||
</Excluded_Packages>
|
||||
</Delphi.Personality>
|
||||
</BorlandProject>
|
||||
43
hfs.cfg
Normal file
43
hfs.cfg
Normal file
@ -0,0 +1,43 @@
|
||||
-$A8
|
||||
-$B-
|
||||
-$C+
|
||||
-$D+
|
||||
-$E-
|
||||
-$F-
|
||||
-$G+
|
||||
-$H+
|
||||
-$I+
|
||||
-$J-
|
||||
-$K-
|
||||
-$L+
|
||||
-$M-
|
||||
-$N+
|
||||
-$O+
|
||||
-$P+
|
||||
-$Q-
|
||||
-$R-
|
||||
-$S-
|
||||
-$T-
|
||||
-$U-
|
||||
-$V+
|
||||
-$W+
|
||||
-$X+
|
||||
-$Y+
|
||||
-$Z1
|
||||
-GD
|
||||
-cg
|
||||
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
|
||||
-H+
|
||||
-W+
|
||||
-M
|
||||
-$M16384,1048576
|
||||
-K$00400000
|
||||
-LE"C:\Users\rejetto\Documents\Borland Studio Projects\Bpl"
|
||||
-LN"C:\Users\rejetto\Documents\Borland Studio Projects\Bpl"
|
||||
-U"c:\program files (x86)\borland\bds\4.0\Lib\Debug;C:\code\other\jcl\source\include"
|
||||
-O"c:\program files (x86)\borland\bds\4.0\Lib\Debug;C:\code\other\jcl\source\include"
|
||||
-I"c:\program files (x86)\borland\bds\4.0\Lib\Debug;C:\code\other\jcl\source\include"
|
||||
-R"c:\program files (x86)\borland\bds\4.0\Lib\Debug;C:\code\other\jcl\source\include"
|
||||
-w-UNSAFE_TYPE
|
||||
-w-UNSAFE_CODE
|
||||
-w-UNSAFE_CAST
|
||||
16
hfs.dfm
Normal file
16
hfs.dfm
Normal file
@ -0,0 +1,16 @@
|
||||
object Form1: TForm1
|
||||
Left = 0
|
||||
Top = 0
|
||||
Caption = 'Form1'
|
||||
ClientHeight = 231
|
||||
ClientWidth = 505
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
end
|
||||
133
hfs.dof
Normal file
133
hfs.dof
Normal file
@ -0,0 +1,133 @@
|
||||
[FileVersion]
|
||||
Version=6.0
|
||||
[Compiler]
|
||||
A=8
|
||||
B=0
|
||||
C=1
|
||||
D=1
|
||||
E=0
|
||||
F=0
|
||||
G=1
|
||||
H=1
|
||||
I=1
|
||||
J=0
|
||||
K=0
|
||||
L=1
|
||||
M=0
|
||||
N=1
|
||||
O=1
|
||||
P=1
|
||||
Q=0
|
||||
R=0
|
||||
S=0
|
||||
T=0
|
||||
U=0
|
||||
V=1
|
||||
W=1
|
||||
X=1
|
||||
Y=2
|
||||
Z=1
|
||||
ShowHints=1
|
||||
ShowWarnings=1
|
||||
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
|
||||
[Linker]
|
||||
MapFile=3
|
||||
OutputObjs=0
|
||||
ConsoleApp=1
|
||||
DebugInfo=0
|
||||
RemoteSymbols=0
|
||||
MinStackSize=16384
|
||||
MaxStackSize=1048576
|
||||
ImageBase=4194304
|
||||
ExeDescription=Http File Server - www.rejetto.com/hfs
|
||||
[Directories]
|
||||
OutputDir=
|
||||
UnitOutputDir=
|
||||
PackageDLLOutputDir=
|
||||
PackageDCPOutputDir=
|
||||
SearchPath=$(DELPHI)\Lib\Debug;C:\code\other\compiled
|
||||
Packages=vcl;rtl;vclx;VclSmp;DJCL60;IcsDel60
|
||||
Conditionals=
|
||||
DebugSourceDirs=C:\code\other\ics\Delphi\Vc32\
|
||||
UsePackages=0
|
||||
[Parameters]
|
||||
RunParams=
|
||||
HostApplication=
|
||||
Launcher=
|
||||
UseLauncher=0
|
||||
DebugCWD=
|
||||
[Version Info]
|
||||
IncludeVerInfo=0
|
||||
AutoIncBuild=0
|
||||
MajorVer=1
|
||||
MinorVer=6
|
||||
Release=0
|
||||
Build=0
|
||||
Debug=0
|
||||
PreRelease=0
|
||||
Special=0
|
||||
Private=0
|
||||
DLL=0
|
||||
Locale=1040
|
||||
CodePage=1252
|
||||
[Version Info Keys]
|
||||
CompanyName=rejetto
|
||||
FileDescription=
|
||||
FileVersion=1.6.0.0
|
||||
InternalName=HFS
|
||||
LegalCopyright=Copyright (C) 2002-2004 Massimo Melina (www.rejetto.com)
|
||||
LegalTrademarks=
|
||||
OriginalFilename=hfs.exe
|
||||
ProductName=Http File Server
|
||||
ProductVersion=1.0.0.0
|
||||
Comments=
|
||||
[Excluded Packages]
|
||||
c:\programmi\borland\delphi6\Bin\dclshlctrls60.bpl=Shell Control Property and Component Editors
|
||||
c:\programmi\borland\delphi6\Projects\Bpl\dclusr60.bpl=Borland User Components
|
||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\JclBaseExpertD60.bpl=JCL Package containing common units for JCL Experts
|
||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\JclDebugExpertD60.bpl=JCL Debug IDE extension
|
||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\JclProjectAnalysisExpertD60.bpl=JCL Project Analyzer
|
||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\JclFavoriteFoldersExpertD60.bpl=JCL Open and Save IDE dialogs with favorite folders
|
||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\JclThreadNameExpertD60.bpl=JCL Thread Name IDE expert
|
||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\JclUsesExpertD60.bpl=JCL Uses Wizard
|
||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\JclSIMDViewExpertD60.bpl=JCL Debug Window of XMM registers
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvAppFrmD6D.bpl=JVCL Application and Form Components
|
||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\JvCoreD6D.bpl=JVCL Core Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvBandsD6D.bpl=JVCL Band Objects
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvCmpD6D.bpl=JVCL Non-Visual Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvCryptD6D.bpl=JVCL Encryption and Compression Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvCtrlsD6D.bpl=JVCL Visual Controls
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvCustomD6D.bpl=JVCL Custom Controls
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvDlgsD6D.bpl=JVCL Dialog Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvDockingD6D.bpl=JVCL Docking Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvDotNetCtrlsD6D.bpl=JVCL DotNet Controls
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvGlobusD6D.bpl=JVCL Globus Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvHMID6D.bpl=JVCL HMI Controls design time unit
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvInterpreterD6D.bpl=JVCL Interpreter Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvJansD6D.bpl=JVCL Jans Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvManagedThreadsD6D.bpl=JVCL Managed Threads
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvMMD6D.bpl=JVCL Multimedia and Image Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvNetD6D.bpl=JVCL Network Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvPageCompsD6D.bpl=JVCL Page Style Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvPluginD6D.bpl=JVCL Plugin Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvPrintPreviewD6D.bpl=JVCL Print Preview Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvRuntimeDesignD6D.bpl=JVCL Runtime Design Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvStdCtrlsD6D.bpl=JVCL Standard Controls
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvSystemD6D.bpl=JVCL System Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvTimeFrameworkD6D.bpl=JVCL Time Framework
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvUIBD6D.bpl=JVCL Unified Interbase Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvValidatorsD6D.bpl=JVCL Validators and Error Provider Components
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvWizardD6D.bpl=JVCL Wizard Design Time Package
|
||||
C:\Programmi\Borland\Delphi6\Projects\Bpl\JvXPCtrlsD6D.bpl=JVCL XP Controls
|
||||
C:\PROGRAMMI\BORLAND\DELPHI6\Bin\PDIFac60.bpl=Interface for ProDelphi viewer
|
||||
c:\programmi\borland\delphi6\Bin\dcl31w60.bpl=Delphi 1.0 Compatibility Components
|
||||
c:\programmi\borland\delphi6\Projects\Bpl\VirtualTreesD6D.bpl=Virtual Treeview
|
||||
[HistoryLists\hlDebugSourcePath]
|
||||
Count=1
|
||||
Item0=C:\code\other\ics\Delphi\Vc32\
|
||||
[HistoryLists\hlUnitAliases]
|
||||
Count=1
|
||||
Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
|
||||
[HistoryLists\hlSearchPath]
|
||||
Count=1
|
||||
Item0=$(DELPHI)\Lib\Debug;C:\code\other\compiled
|
||||
115
hfs.dpr
Normal file
115
hfs.dpr
Normal file
@ -0,0 +1,115 @@
|
||||
{
|
||||
Copyright (C) 2002-2014 Massimo Melina (www.rejetto.com)
|
||||
|
||||
This file is part of HFS ~ HTTP File Server.
|
||||
|
||||
HFS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
HFS is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with HSG; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
}
|
||||
{$INCLUDE defs.inc }
|
||||
{$SetPEOptFlags $100 } //IMAGE_DLLCHARACTERISTICS_NX_COMPAT
|
||||
program hfs;
|
||||
|
||||
uses
|
||||
//FastMM4,
|
||||
//uFreeLocalizer,
|
||||
{$IFDEF EX_DEBUG}
|
||||
ftmExceptionForm,
|
||||
{$ENDIF }
|
||||
monoLib,
|
||||
Forms,
|
||||
windows,
|
||||
types,
|
||||
hslib,
|
||||
sysUtils,
|
||||
main in 'main.pas' {mainFrm},
|
||||
newuserpassDlg in 'newuserpassDlg.pas' {newuserpassFrm},
|
||||
optionsDlg in 'optionsDlg.pas' {optionsFrm},
|
||||
utillib in 'utillib.pas',
|
||||
longinputDlg in 'longinputDlg.pas' {longinputFrm},
|
||||
folderKindDlg in 'folderKindDlg.pas' {folderKindFrm},
|
||||
shellExtDlg in 'shellExtDlg.pas' {shellExtFrm},
|
||||
diffDlg in 'diffDlg.pas' {diffFrm},
|
||||
classesLib in 'classesLib.pas',
|
||||
ipsEverDlg in 'ipsEverDlg.pas' {ipsEverFrm},
|
||||
parserLib in 'parserLib.pas',
|
||||
purgeDlg in 'purgeDlg.pas' {purgeFrm},
|
||||
listSelectDlg in 'listSelectDlg.pas' {listSelectFrm},
|
||||
filepropDlg in 'filepropDlg.pas' {filepropFrm},
|
||||
runscriptDlg in 'runscriptDlg.pas' {runScriptFrm},
|
||||
scriptLib in 'scriptLib.pas';
|
||||
|
||||
{$R *.res}
|
||||
|
||||
procedure processSlaveParams(params:string);
|
||||
var
|
||||
ss: TStringDynArray;
|
||||
begin
|
||||
if mainfrm = NIL then exit;
|
||||
ss:=split(#13,params);
|
||||
processParams_before(ss);
|
||||
mainfrm.processParams_after(ss);
|
||||
end;
|
||||
|
||||
function isSingleInstance():boolean;
|
||||
var
|
||||
params:TStringDynArray;
|
||||
ini, tpl:string;
|
||||
begin
|
||||
result:=FALSE;
|
||||
// the -i parameter affects loadCfg()
|
||||
params:=paramsAsArray();
|
||||
processParams_before(params, 'i');
|
||||
loadCfg(ini, tpl);
|
||||
chop('only-1-instance=', ini);
|
||||
if ini = '' then exit;
|
||||
ini:=chopLine(ini);
|
||||
result:=sameText(ini, 'yes');
|
||||
end; // isSingleInstance
|
||||
|
||||
begin
|
||||
mono.onSlaveParams:=processSlaveParams;
|
||||
if not holdingKey(VK_CONTROL) then
|
||||
begin
|
||||
if not mono.init('HttpFileServer') then
|
||||
begin
|
||||
msgDlg('monoLib error: '+mono.error, MB_ICONERROR+MB_OK);
|
||||
halt(1);
|
||||
end;
|
||||
if not mono.master and isSingleInstance() then
|
||||
begin
|
||||
mono.sendParams();
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
{$IFDEF EX_DEBUG}initErrorHandler(format('HFS %s (%s)', [VERSION, VERSION_BUILD]));{$ENDIF}
|
||||
Application.Initialize();
|
||||
{
|
||||
if fileExists('hfs.lng') then
|
||||
begin
|
||||
FreeLocalizer.AutoTranslate := True;
|
||||
try FreeLocalizer.LanguageFile := 'hfs.lng';
|
||||
except msgDlg('Localization not supporting your codepage', MB_ICONERROR+MB_OK) end;
|
||||
end;
|
||||
}
|
||||
Application.CreateForm(TmainFrm, mainFrm);
|
||||
Application.CreateForm(TnewuserpassFrm, newuserpassFrm);
|
||||
Application.CreateForm(ToptionsFrm, optionsFrm);
|
||||
Application.CreateForm(TdiffFrm, diffFrm);
|
||||
Application.CreateForm(TipsEverFrm, ipsEverFrm);
|
||||
Application.CreateForm(TrunScriptFrm, runScriptFrm);
|
||||
mainfrm.finalInit();
|
||||
Application.Run;
|
||||
{$IFDEF EX_DEBUG}closeErrorHandler();{$ENDIF}
|
||||
end.
|
||||
973
hfs.dproj
Normal file
973
hfs.dproj
Normal file
@ -0,0 +1,973 @@
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{3BBE6A58-B0E7-4454-B009-5B21EFD56A84}</ProjectGuid>
|
||||
<MainSource>hfs.dpr</MainSource>
|
||||
<Config Condition="'$(Config)'==''">Debug</Config>
|
||||
<DCC_DCCCompiler>DCC32</DCC_DCCCompiler>
|
||||
<ProjectVersion>18.8</ProjectVersion>
|
||||
<Base>True</Base>
|
||||
<AppType>Application</AppType>
|
||||
<FrameworkType>VCL</FrameworkType>
|
||||
<Platform Condition="'$(Platform)'==''">Win32</Platform>
|
||||
<TargetedPlatforms>1</TargetedPlatforms>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
|
||||
<Base_Win32>true</Base_Win32>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
|
||||
<Cfg_1>true</Cfg_1>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
|
||||
<Cfg_1_Win32>true</Cfg_1_Win32>
|
||||
<CfgParent>Cfg_1</CfgParent>
|
||||
<Cfg_1>true</Cfg_1>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
|
||||
<Cfg_2>true</Cfg_2>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
|
||||
<Cfg_2_Win32>true</Cfg_2_Win32>
|
||||
<CfgParent>Cfg_2</CfgParent>
|
||||
<Cfg_2>true</Cfg_2>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Base)'!=''">
|
||||
<DCC_DependencyCheckOutputName>hfs.exe</DCC_DependencyCheckOutputName>
|
||||
<DCC_ImageBase>00400000</DCC_ImageBase>
|
||||
<DCC_MapFile>3</DCC_MapFile>
|
||||
<DCC_UnitSearchPath>$(DELPHI)\Lib\Debug;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
|
||||
<DCC_Platform>x86</DCC_Platform>
|
||||
<DCC_Description>HFS ~ HTTP File Server - www.rejetto.com/hfs</DCC_Description>
|
||||
<DCC_UsePackage>vcl;rtl;vclx;VclSmp;DJCL60;IcsDel60;$(DCC_UsePackage)</DCC_UsePackage>
|
||||
<DCC_K>false</DCC_K>
|
||||
<DCC_N>true</DCC_N>
|
||||
<DCC_S>false</DCC_S>
|
||||
<DCC_F>false</DCC_F>
|
||||
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
|
||||
<DebugSourcePath>C:\code\other\ics\Delphi\Vc32\;$(DebugSourcePath)</DebugSourcePath>
|
||||
<DCC_E>false</DCC_E>
|
||||
<SanitizedProjectName>hfs</SanitizedProjectName>
|
||||
<DCC_Namespace>Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace)</DCC_Namespace>
|
||||
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
|
||||
<VerInfo_MinorVer>6</VerInfo_MinorVer>
|
||||
<VerInfo_Locale>1040</VerInfo_Locale>
|
||||
<VerInfo_Keys>CompanyName=rejetto;FileDescription=;FileVersion=1.6.0.0;InternalName=HFS;LegalCopyright=Copyright (C) 2002-2004 Massimo Melina (www.rejetto.com);LegalTrademarks=;OriginalFilename=hfs.exe;ProductName=Http File Server;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Base_Win32)'!=''">
|
||||
<DCC_Namespace>Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
|
||||
<BT_BuildType>Debug</BT_BuildType>
|
||||
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
|
||||
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName)</VerInfo_Keys>
|
||||
<VerInfo_Locale>1033</VerInfo_Locale>
|
||||
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
|
||||
<Debugger_RunParams>-c only-1-instance=no</Debugger_RunParams>
|
||||
<Icon_MainIcon>hfs_Icon1.ico</Icon_MainIcon>
|
||||
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
|
||||
<UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44>
|
||||
<UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_1)'!=''">
|
||||
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
|
||||
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
|
||||
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
|
||||
<DCC_DebugInformation>0</DCC_DebugInformation>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
|
||||
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
|
||||
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_2)'!=''">
|
||||
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
|
||||
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
|
||||
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<DelphiCompile Include="$(MainSource)">
|
||||
<MainSource>MainSource</MainSource>
|
||||
</DelphiCompile>
|
||||
<DCCReference Include="main.pas">
|
||||
<Form>mainFrm</Form>
|
||||
</DCCReference>
|
||||
<DCCReference Include="newuserpassDlg.pas">
|
||||
<Form>newuserpassFrm</Form>
|
||||
</DCCReference>
|
||||
<DCCReference Include="optionsDlg.pas">
|
||||
<Form>optionsFrm</Form>
|
||||
</DCCReference>
|
||||
<DCCReference Include="utillib.pas"/>
|
||||
<DCCReference Include="longinputDlg.pas">
|
||||
<Form>longinputFrm</Form>
|
||||
</DCCReference>
|
||||
<DCCReference Include="folderKindDlg.pas">
|
||||
<Form>folderKindFrm</Form>
|
||||
</DCCReference>
|
||||
<DCCReference Include="shellExtDlg.pas">
|
||||
<Form>shellExtFrm</Form>
|
||||
</DCCReference>
|
||||
<DCCReference Include="diffDlg.pas">
|
||||
<Form>diffFrm</Form>
|
||||
</DCCReference>
|
||||
<DCCReference Include="classesLib.pas"/>
|
||||
<DCCReference Include="ipsEverDlg.pas">
|
||||
<Form>ipsEverFrm</Form>
|
||||
</DCCReference>
|
||||
<DCCReference Include="parserLib.pas"/>
|
||||
<DCCReference Include="purgeDlg.pas">
|
||||
<Form>purgeFrm</Form>
|
||||
</DCCReference>
|
||||
<DCCReference Include="listSelectDlg.pas">
|
||||
<Form>listSelectFrm</Form>
|
||||
</DCCReference>
|
||||
<DCCReference Include="filepropDlg.pas">
|
||||
<Form>filepropFrm</Form>
|
||||
</DCCReference>
|
||||
<DCCReference Include="runscriptDlg.pas">
|
||||
<Form>runScriptFrm</Form>
|
||||
</DCCReference>
|
||||
<DCCReference Include="scriptLib.pas"/>
|
||||
<None Include="hfs.dpr"/>
|
||||
<BuildConfiguration Include="Debug">
|
||||
<Key>Cfg_2</Key>
|
||||
<CfgParent>Base</CfgParent>
|
||||
</BuildConfiguration>
|
||||
<BuildConfiguration Include="Base">
|
||||
<Key>Base</Key>
|
||||
</BuildConfiguration>
|
||||
<BuildConfiguration Include="Release">
|
||||
<Key>Cfg_1</Key>
|
||||
<CfgParent>Base</CfgParent>
|
||||
</BuildConfiguration>
|
||||
</ItemGroup>
|
||||
<Import Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')" Project="$(BDS)\Bin\CodeGear.Delphi.Targets"/>
|
||||
<ProjectExtensions>
|
||||
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
|
||||
<Borland.ProjectType>VCLApplication</Borland.ProjectType>
|
||||
<BorlandProject>
|
||||
<Delphi.Personality>
|
||||
<Source>
|
||||
<Source Name="MainSource">hfs.dpr</Source>
|
||||
</Source>
|
||||
<Parameters>
|
||||
<Parameters Name="RunParams">-c only-1-instance=no</Parameters>
|
||||
</Parameters>
|
||||
<VersionInfo>
|
||||
<VersionInfo Name="IncludeVerInfo">True</VersionInfo>
|
||||
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
|
||||
<VersionInfo Name="MajorVer">1</VersionInfo>
|
||||
<VersionInfo Name="MinorVer">6</VersionInfo>
|
||||
<VersionInfo Name="Release">0</VersionInfo>
|
||||
<VersionInfo Name="Build">0</VersionInfo>
|
||||
<VersionInfo Name="Debug">False</VersionInfo>
|
||||
<VersionInfo Name="PreRelease">False</VersionInfo>
|
||||
<VersionInfo Name="Special">False</VersionInfo>
|
||||
<VersionInfo Name="Private">False</VersionInfo>
|
||||
<VersionInfo Name="DLL">False</VersionInfo>
|
||||
<VersionInfo Name="Locale">1040</VersionInfo>
|
||||
<VersionInfo Name="CodePage">1252</VersionInfo>
|
||||
</VersionInfo>
|
||||
<VersionInfoKeys>
|
||||
<VersionInfoKeys Name="CompanyName">rejetto</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="FileDescription"/>
|
||||
<VersionInfoKeys Name="FileVersion">1.6.0.0</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="InternalName">HFS</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="LegalCopyright">Copyright (C) 2002-2004 Massimo Melina (www.rejetto.com)</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="LegalTrademarks"/>
|
||||
<VersionInfoKeys Name="OriginalFilename">hfs.exe</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="ProductName">Http File Server</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="Comments"/>
|
||||
</VersionInfoKeys>
|
||||
<Excluded_Packages>
|
||||
<Excluded_Packages Name="c:\programmi\borland\bds\4.0\Bin\dclib100.bpl">Borland InterBase Express Components</Excluded_Packages>
|
||||
<Excluded_Packages Name="c:\programmi\borland\bds\4.0\Bin\dclIndyCore100.bpl">Indy 10 Core Design Time</Excluded_Packages>
|
||||
<Excluded_Packages Name="c:\programmi\borland\bds\4.0\Bin\dclsmp100.bpl">Borland Sample Components</Excluded_Packages>
|
||||
<Excluded_Packages Name="c:\programmi\borland\bds\4.0\Bin\dclIndyProtocols100.bpl">Indy 10 Protocols Design Time</Excluded_Packages>
|
||||
<Excluded_Packages Name="c:\programmi\borland\bds\4.0\Bin\dcltee100.bpl">TeeChart Components</Excluded_Packages>
|
||||
</Excluded_Packages>
|
||||
</Delphi.Personality>
|
||||
<Platforms>
|
||||
<Platform value="Win32">True</Platform>
|
||||
</Platforms>
|
||||
<ModelSupport>False</ModelSupport>
|
||||
<Deployment Version="3">
|
||||
<DeployFile LocalName="hfs.exe" Configuration="Debug" Class="ProjectOutput">
|
||||
<Platform Name="Win32">
|
||||
<RemoteName>hfs.exe</RemoteName>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="hfs.dpr" Configuration="Debug" Class="ProjectFile">
|
||||
<Platform Name="Win32">
|
||||
<RemoteDir>.\</RemoteDir>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployClass Name="AdditionalDebugSymbols">
|
||||
<Platform Name="OSX32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Win32">
|
||||
<Operation>0</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="AndroidClassesDexFile">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>classes</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>classes</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="AndroidFileProvider">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\xml</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\xml</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="AndroidGDBServer">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="AndroidLibnativeArmeabiFile">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>library\lib\armeabi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>library\lib\armeabi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="AndroidLibnativeArmeabiv7aFile">
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="AndroidLibnativeMipsFile">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>library\lib\mips</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>library\lib\mips</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="AndroidServiceOutput">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>library\lib\arm64-v8a</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="AndroidServiceOutput_Android32">
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="AndroidSplashImageDef">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="AndroidSplashStyles">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\values</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\values</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="AndroidSplashStylesV21">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\values-v21</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\values-v21</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_Colors">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\values</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\values</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_DefaultAppIcon">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_LauncherIcon144">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_LauncherIcon36">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-ldpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-ldpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_LauncherIcon48">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-mdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-mdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_LauncherIcon72">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-hdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-hdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_LauncherIcon96">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-xhdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-xhdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_NotificationIcon24">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-mdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-mdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_NotificationIcon36">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-hdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-hdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_NotificationIcon48">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-xhdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-xhdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_NotificationIcon72">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_NotificationIcon96">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_SplashImage426">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-small</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-small</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_SplashImage470">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-normal</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-normal</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_SplashImage640">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-large</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-large</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_SplashImage960">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-xlarge</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-xlarge</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_Strings">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\values</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\values</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="DebugSymbols">
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="OSX32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Win32">
|
||||
<Operation>0</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="DependencyFramework">
|
||||
<Platform Name="OSX32">
|
||||
<Operation>1</Operation>
|
||||
<Extensions>.framework</Extensions>
|
||||
</Platform>
|
||||
<Platform Name="OSX64">
|
||||
<Operation>1</Operation>
|
||||
<Extensions>.framework</Extensions>
|
||||
</Platform>
|
||||
<Platform Name="Win32">
|
||||
<Operation>0</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="DependencyModule">
|
||||
<Platform Name="OSX32">
|
||||
<Operation>1</Operation>
|
||||
<Extensions>.dylib</Extensions>
|
||||
</Platform>
|
||||
<Platform Name="OSX64">
|
||||
<Operation>1</Operation>
|
||||
<Extensions>.dylib</Extensions>
|
||||
</Platform>
|
||||
<Platform Name="Win32">
|
||||
<Operation>0</Operation>
|
||||
<Extensions>.dll;.bpl</Extensions>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Required="true" Name="DependencyPackage">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
<Extensions>.dylib</Extensions>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
<Extensions>.dylib</Extensions>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
<Extensions>.dylib</Extensions>
|
||||
</Platform>
|
||||
<Platform Name="OSX32">
|
||||
<Operation>1</Operation>
|
||||
<Extensions>.dylib</Extensions>
|
||||
</Platform>
|
||||
<Platform Name="OSX64">
|
||||
<Operation>1</Operation>
|
||||
<Extensions>.dylib</Extensions>
|
||||
</Platform>
|
||||
<Platform Name="Win32">
|
||||
<Operation>0</Operation>
|
||||
<Extensions>.bpl</Extensions>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="File">
|
||||
<Platform Name="Android">
|
||||
<Operation>0</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<Operation>0</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>0</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>0</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>0</Operation>
|
||||
</Platform>
|
||||
<Platform Name="OSX32">
|
||||
<Operation>0</Operation>
|
||||
</Platform>
|
||||
<Platform Name="OSX64">
|
||||
<Operation>0</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Win32">
|
||||
<Operation>0</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPad_Launch1024x768">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPad_Launch1536x2048">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPad_Launch1668">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPad_Launch1668x2388">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPad_Launch2048x1536">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPad_Launch2048x2732">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPad_Launch2224">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPad_Launch2388x1668">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPad_Launch2732x2048">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPad_Launch768x1024">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPhone_Launch1125">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPhone_Launch1136x640">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPhone_Launch1242">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPhone_Launch1242x2688">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPhone_Launch1334">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPhone_Launch1792">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPhone_Launch2208">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPhone_Launch2436">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPhone_Launch2688x1242">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPhone_Launch320">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPhone_Launch640">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPhone_Launch640x1136">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPhone_Launch750">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iPhone_Launch828">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="ProjectAndroidManifest">
|
||||
<Platform Name="Android">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="ProjectiOSDeviceDebug">
|
||||
<Platform Name="iOSDevice32">
|
||||
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="ProjectiOSDeviceResourceRules"/>
|
||||
<DeployClass Name="ProjectiOSEntitlements"/>
|
||||
<DeployClass Name="ProjectiOSInfoPList"/>
|
||||
<DeployClass Name="ProjectiOSResource">
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="ProjectOSXDebug"/>
|
||||
<DeployClass Name="ProjectOSXEntitlements"/>
|
||||
<DeployClass Name="ProjectOSXInfoPList"/>
|
||||
<DeployClass Name="ProjectOSXResource">
|
||||
<Platform Name="OSX32">
|
||||
<RemoteDir>Contents\Resources</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="OSX64">
|
||||
<RemoteDir>Contents\Resources</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Required="true" Name="ProjectOutput">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>library\lib\arm64-v8a</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSDevice64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Linux64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="OSX32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="OSX64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Win32">
|
||||
<Operation>0</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="ProjectOutput_Android32">
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="ProjectUWPManifest">
|
||||
<Platform Name="Win32">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Win64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="UWP_DelphiLogo150">
|
||||
<Platform Name="Win32">
|
||||
<RemoteDir>Assets</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Win64">
|
||||
<RemoteDir>Assets</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="UWP_DelphiLogo44">
|
||||
<Platform Name="Win32">
|
||||
<RemoteDir>Assets</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Win64">
|
||||
<RemoteDir>Assets</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/>
|
||||
<ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
|
||||
<ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/>
|
||||
<ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/>
|
||||
<ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
|
||||
<ProjectRoot Platform="OSX32" Name="$(PROJECTNAME)"/>
|
||||
<ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/>
|
||||
<ProjectRoot Platform="OSX64" Name="$(PROJECTNAME)"/>
|
||||
<ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/>
|
||||
<ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/>
|
||||
</Deployment>
|
||||
</BorlandProject>
|
||||
<ProjectFileVersion>12</ProjectFileVersion>
|
||||
</ProjectExtensions>
|
||||
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
|
||||
<Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/>
|
||||
</Project>
|
||||
34
hfs.dproj.local
Normal file
34
hfs.dproj.local
Normal file
@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<BorlandProject>
|
||||
<ProjectSortOrder AutoSort="0" SortType="0">
|
||||
<File Path="classesLib.pas"/>
|
||||
<File Path="diffDlg.pas"/>
|
||||
<File Path="diffDlg.dfm"/>
|
||||
<File Path="filepropDlg.pas"/>
|
||||
<File Path="filepropDlg.dfm"/>
|
||||
<File Path="folderKindDlg.pas"/>
|
||||
<File Path="folderKindDlg.dfm"/>
|
||||
<File Path="hfs.dpr"/>
|
||||
<File Path="ipsEverDlg.pas"/>
|
||||
<File Path="ipsEverDlg.dfm"/>
|
||||
<File Path="listSelectDlg.pas"/>
|
||||
<File Path="listSelectDlg.dfm"/>
|
||||
<File Path="longinputDlg.pas"/>
|
||||
<File Path="longinputDlg.dfm"/>
|
||||
<File Path="main.pas"/>
|
||||
<File Path="main.dfm"/>
|
||||
<File Path="newuserpassDlg.pas"/>
|
||||
<File Path="newuserpassDlg.dfm"/>
|
||||
<File Path="optionsDlg.pas"/>
|
||||
<File Path="optionsDlg.dfm"/>
|
||||
<File Path="parserLib.pas"/>
|
||||
<File Path="purgeDlg.pas"/>
|
||||
<File Path="purgeDlg.dfm"/>
|
||||
<File Path="runscriptDlg.pas"/>
|
||||
<File Path="runscriptDlg.dfm"/>
|
||||
<File Path="scriptLib.pas"/>
|
||||
<File Path="shellExtDlg.pas"/>
|
||||
<File Path="shellExtDlg.dfm"/>
|
||||
<File Path="utillib.pas"/>
|
||||
</ProjectSortOrder>
|
||||
</BorlandProject>
|
||||
185
hfs.dsk
Normal file
185
hfs.dsk
Normal file
@ -0,0 +1,185 @@
|
||||
[Closed Files]
|
||||
File_0=SourceModule,'C:\code\mine\hfs\whatsnew.txt',0,1,13,28,45,0,0
|
||||
File_1=SourceModule,'C:\code\mine\hslib\hslib.pas',0,1,901,26,924,0,0
|
||||
File_2=SourceModule,'C:\code\mine\hfs\utillib.pas',0,1,46,1,80,0,0
|
||||
File_3=SourceModule,'C:\code\mine\hfs\todo.txt',0,1,1,1,1,0,0
|
||||
File_4=SourceModule,'C:\code\other\ics\Delphi\Vc32\WSocket.pas',0,1,2948,36,2957,0,0
|
||||
File_5=SourceModule,'C:\code\other\ics\Delphi\Vc32\WSocketS.pas',0,1,48,46,265,0,0
|
||||
File_6=SourceModule,'C:\code\other\ics\Delphi\Vc32\UUEncode.pas',0,1,64,21,82,0,0
|
||||
File_7=SourceModule,'C:\code\mine\andrq\utilLib.pas',0,1,3737,25,3767,0,0
|
||||
File_8=SourceModule,'C:\code\mine\andrq\prefDlg.pas',0,1,570,27,590,1,0
|
||||
|
||||
[Modules]
|
||||
Module0=C:\code\mine\hfs\main.pas
|
||||
Count=1
|
||||
EditWindowCount=1
|
||||
|
||||
[C:\code\mine\hfs\main.pas]
|
||||
ModuleType=SourceModule
|
||||
FormState=1
|
||||
FormOnTop=0
|
||||
|
||||
[C:\Programmi\Borland\Delphi6\Projects\ProjectGroup1.bpg]
|
||||
FormState=0
|
||||
FormOnTop=0
|
||||
|
||||
[C:\code\mine\hfs\hfs.dpr]
|
||||
FormState=0
|
||||
FormOnTop=0
|
||||
|
||||
[EditWindow0]
|
||||
ViewCount=1
|
||||
CurrentView=0
|
||||
View0=0
|
||||
MessageView=MessageView@EditWindow0
|
||||
Create=1
|
||||
Visible=1
|
||||
State=0
|
||||
Left=190
|
||||
Top=101
|
||||
Width=834
|
||||
Height=639
|
||||
MaxLeft=-4
|
||||
MaxTop=97
|
||||
ClientWidth=826
|
||||
ClientHeight=612
|
||||
LeftPanelSize=0
|
||||
RightPanelSize=0
|
||||
BottomPanelSize=0
|
||||
BottomPanelClients=MessageView@EditWindow0
|
||||
BottomPanelData=00000400010000000B0000004D6573736167655669657700000000000000000000000000000000000100000000000000000B0000004D65737361676556696577FFFFFFFF
|
||||
|
||||
[View0]
|
||||
Module=C:\code\mine\hfs\main.pas
|
||||
CursorX=33
|
||||
CursorY=63
|
||||
TopLine=41
|
||||
LeftCol=1
|
||||
|
||||
[Watches]
|
||||
Count=1
|
||||
Watch0='h',256,0,18,1,0
|
||||
|
||||
[Breakpoints]
|
||||
Count=0
|
||||
|
||||
[AddressBreakpoints]
|
||||
Count=0
|
||||
|
||||
[Main Window]
|
||||
Create=1
|
||||
Visible=1
|
||||
State=2
|
||||
Left=0
|
||||
Top=0
|
||||
Width=1024
|
||||
Height=105
|
||||
MaxLeft=-4
|
||||
MaxTop=-4
|
||||
MaxWidth=1032
|
||||
MaxHeight=105
|
||||
ClientWidth=1024
|
||||
ClientHeight=78
|
||||
|
||||
[ProjectManager]
|
||||
Create=1
|
||||
Visible=0
|
||||
State=0
|
||||
Left=369
|
||||
Top=372
|
||||
Width=438
|
||||
Height=303
|
||||
MaxLeft=-1
|
||||
MaxTop=-1
|
||||
ClientWidth=430
|
||||
ClientHeight=279
|
||||
TBDockHeight=303
|
||||
LRDockWidth=438
|
||||
Dockable=1
|
||||
|
||||
[CPUWindow]
|
||||
Create=1
|
||||
Visible=0
|
||||
State=0
|
||||
Left=245
|
||||
Top=207
|
||||
Width=533
|
||||
Height=353
|
||||
MaxLeft=-1
|
||||
MaxTop=-1
|
||||
ClientWidth=525
|
||||
ClientHeight=326
|
||||
DumpPane=79
|
||||
DisassemblyPane=187
|
||||
RegisterPane=231
|
||||
FlagPane=64
|
||||
|
||||
[AlignmentPalette]
|
||||
Create=1
|
||||
Visible=0
|
||||
State=0
|
||||
Left=200
|
||||
Top=107
|
||||
Width=156
|
||||
Height=82
|
||||
MaxLeft=-1
|
||||
MaxTop=-1
|
||||
ClientWidth=150
|
||||
ClientHeight=60
|
||||
|
||||
[PropertyInspector]
|
||||
Create=1
|
||||
Visible=1
|
||||
State=0
|
||||
Left=0
|
||||
Top=119
|
||||
Width=190
|
||||
Height=621
|
||||
MaxLeft=-1
|
||||
MaxTop=-1
|
||||
ClientWidth=182
|
||||
ClientHeight=597
|
||||
TBDockHeight=621
|
||||
LRDockWidth=190
|
||||
Dockable=1
|
||||
SplitPos=85
|
||||
ArrangeBy=Name
|
||||
SelectedItem=Caption
|
||||
ExpandedItems=
|
||||
HiddenCategories=
|
||||
|
||||
[ObjectTree]
|
||||
Create=1
|
||||
Visible=1
|
||||
State=0
|
||||
Left=1
|
||||
Top=99
|
||||
Width=190
|
||||
Height=252
|
||||
MaxLeft=-1
|
||||
MaxTop=-1
|
||||
ClientWidth=182
|
||||
ClientHeight=228
|
||||
TBDockHeight=252
|
||||
LRDockWidth=190
|
||||
Dockable=1
|
||||
|
||||
[MessageView@EditWindow0]
|
||||
Create=1
|
||||
Visible=0
|
||||
State=0
|
||||
Left=12
|
||||
Top=0
|
||||
Width=814
|
||||
Height=52
|
||||
MaxLeft=-1
|
||||
MaxTop=-1
|
||||
ClientWidth=814
|
||||
ClientHeight=52
|
||||
TBDockHeight=52
|
||||
LRDockWidth=443
|
||||
Dockable=1
|
||||
|
||||
[DockHosts]
|
||||
DockHostCount=0
|
||||
|
||||
3
hfs.events
Normal file
3
hfs.events
Normal file
@ -0,0 +1,3 @@
|
||||
[+download]
|
||||
{.remove header|ETag.}
|
||||
{.remove header|Set-cookie.}
|
||||
BIN
hfs.identcache
Normal file
BIN
hfs.identcache
Normal file
Binary file not shown.
BIN
hfs.otares
Normal file
BIN
hfs.otares
Normal file
Binary file not shown.
28
hfs.pas
Normal file
28
hfs.pas
Normal file
@ -0,0 +1,28 @@
|
||||
unit hfs;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
|
||||
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
|
||||
|
||||
type
|
||||
TForm1 = class(TForm)
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
var
|
||||
Form1: TForm1;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
initialization
|
||||
showMessage('test');
|
||||
|
||||
|
||||
end.
|
||||
BIN
hfs_Icon.ico
Normal file
BIN
hfs_Icon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
BIN
hfs_Icon1.ico
Normal file
BIN
hfs_Icon1.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
BIN
hfs_Icon2.ico
Normal file
BIN
hfs_Icon2.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
10
invertban.txt
Normal file
10
invertban.txt
Normal file
@ -0,0 +1,10 @@
|
||||
This is already explained in the docs, but people don't read docs.
|
||||
If you want to allow only specified addresses to access your files, you can.
|
||||
You need only 1 row to get it.
|
||||
|
||||
Let say you want 1 and 2 to pass, others to be blocked.
|
||||
Just put this IP address mask: \1;2
|
||||
The opening \ character inverts the logic, so everything that is NOT 1 or 2 will be banned.
|
||||
E.g. 3 will be banned.
|
||||
|
||||
If you want to know more about address masks, check the guide.
|
||||
63
ipsEverDlg.dfm
Normal file
63
ipsEverDlg.dfm
Normal file
@ -0,0 +1,63 @@
|
||||
object ipsEverFrm: TipsEverFrm
|
||||
Left = 0
|
||||
Top = 0
|
||||
BorderStyle = bsDialog
|
||||
Caption = 'Addresses ever connected'
|
||||
ClientHeight = 275
|
||||
ClientWidth = 286
|
||||
Color = clBtnFace
|
||||
Constraints.MaxHeight = 300
|
||||
Constraints.MinHeight = 300
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
Position = poMainFormCenter
|
||||
OnShow = FormShow
|
||||
DesignSize = (
|
||||
286
|
||||
275)
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object totalLbl: TLabel
|
||||
Left = 197
|
||||
Top = 253
|
||||
Width = 61
|
||||
Height = 13
|
||||
Anchors = [akLeft]
|
||||
Caption = 'Total label...'
|
||||
end
|
||||
object ipsBox: TMemo
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 286
|
||||
Height = 242
|
||||
Align = alTop
|
||||
Anchors = [akLeft, akTop, akRight, akBottom]
|
||||
ReadOnly = True
|
||||
ScrollBars = ssVertical
|
||||
TabOrder = 0
|
||||
end
|
||||
object resetBtn: TButton
|
||||
Left = 114
|
||||
Top = 248
|
||||
Width = 75
|
||||
Height = 25
|
||||
Anchors = [akLeft]
|
||||
Caption = '&Reset'
|
||||
TabOrder = 1
|
||||
OnClick = resetBtnClick
|
||||
end
|
||||
object editBtn: TButton
|
||||
Left = 8
|
||||
Top = 248
|
||||
Width = 95
|
||||
Height = 25
|
||||
Anchors = [akLeft]
|
||||
Caption = '&Open in editor'
|
||||
TabOrder = 2
|
||||
OnClick = editBtnClick
|
||||
end
|
||||
end
|
||||
60
ipsEverDlg.pas
Normal file
60
ipsEverDlg.pas
Normal file
@ -0,0 +1,60 @@
|
||||
unit ipsEverDlg;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, StdCtrls;
|
||||
|
||||
type
|
||||
TipsEverFrm = class(TForm)
|
||||
ipsBox: TMemo;
|
||||
resetBtn: TButton;
|
||||
totalLbl: TLabel;
|
||||
editBtn: TButton;
|
||||
procedure resetBtnClick(Sender: TObject);
|
||||
procedure FormShow(Sender: TObject);
|
||||
procedure editBtnClick(Sender: TObject);
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
procedure refreshData();
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
var
|
||||
ipsEverFrm: TipsEverFrm;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
uses
|
||||
main, utilLib;
|
||||
|
||||
procedure TipsEverFrm.resetBtnClick(Sender: TObject);
|
||||
begin
|
||||
ipsEverConnected.clear();
|
||||
refreshData();
|
||||
end;
|
||||
|
||||
procedure TipsEverFrm.editBtnClick(Sender: TObject);
|
||||
var
|
||||
fn: string;
|
||||
begin
|
||||
fn:=saveTempFile(ipsEverConnected.text);
|
||||
if renameFile(fn, fn+'.txt') then exec(fn+'.txt')
|
||||
else msgDlg(MSG_NO_TEMP, MB_ICONERROR);
|
||||
end;
|
||||
|
||||
procedure TipsEverFrm.FormShow(Sender: TObject);
|
||||
begin refreshData() end;
|
||||
|
||||
procedure TipsEverFrm.refreshData();
|
||||
begin
|
||||
ipsBox.text:=ipsEverConnected.text;
|
||||
totalLbl.caption:=format('Total: %d', [ipsEverConnected.count]);
|
||||
repaintTray();
|
||||
end; // refreshData
|
||||
|
||||
end.
|
||||
2
ipservices.txt
Normal file
2
ipservices.txt
Normal file
@ -0,0 +1,2 @@
|
||||
http://hfsservice.rejetto.com/ip.php|!
|
||||
http://checkip.dyndns.org|:
|
||||
7
jquery.min.js
vendored
Normal file
7
jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
54
listSelectDlg.dfm
Normal file
54
listSelectDlg.dfm
Normal file
@ -0,0 +1,54 @@
|
||||
object listSelectFrm: TlistSelectFrm
|
||||
Left = 0
|
||||
Top = 0
|
||||
BorderStyle = bsToolWindow
|
||||
ClientHeight = 173
|
||||
ClientWidth = 183
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
Position = poMainFormCenter
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object listBox: TCheckListBox
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 183
|
||||
Height = 136
|
||||
Align = alClient
|
||||
ItemHeight = 13
|
||||
TabOrder = 0
|
||||
end
|
||||
object Panel1: TPanel
|
||||
Left = 0
|
||||
Top = 136
|
||||
Width = 183
|
||||
Height = 37
|
||||
Align = alBottom
|
||||
BevelOuter = bvNone
|
||||
TabOrder = 1
|
||||
object okBtn: TButton
|
||||
Left = 8
|
||||
Top = 6
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '&OK'
|
||||
Default = True
|
||||
ModalResult = 1
|
||||
TabOrder = 0
|
||||
end
|
||||
object cancelBtn: TButton
|
||||
Left = 96
|
||||
Top = 6
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '&Cancel'
|
||||
ModalResult = 2
|
||||
TabOrder = 1
|
||||
end
|
||||
end
|
||||
end
|
||||
49
listSelectDlg.pas
Normal file
49
listSelectDlg.pas
Normal file
@ -0,0 +1,49 @@
|
||||
unit listSelectDlg;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, StdCtrls, ExtCtrls, CheckLst, types, utilLib, strutils;
|
||||
|
||||
type
|
||||
TlistSelectFrm = class(TForm)
|
||||
listBox: TCheckListBox;
|
||||
Panel1: TPanel;
|
||||
okBtn: TButton;
|
||||
cancelBtn: TButton;
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
function listSelect(title:string; var options:TstringList):boolean;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
function listSelect(title:string; var options:TstringList):boolean;
|
||||
var
|
||||
dlg: TlistSelectFrm;
|
||||
i: integer;
|
||||
begin
|
||||
result:=FALSE;
|
||||
dlg:=TlistSelectFrm.Create(NIL);
|
||||
with dlg do
|
||||
try
|
||||
caption:=title;
|
||||
listBox.items.assign(options);
|
||||
for i:=0 to options.count-1 do
|
||||
if options.objects[i] <> NIL then
|
||||
listbox.Checked[i]:=TRUE;
|
||||
clientHeight:=clientHeight-listBox.ClientHeight+listBox.ItemHeight*minmax(5,15, listbox.count);
|
||||
if showModal() = mrCancel then exit;
|
||||
for i:=0 to listbox.Count-1 do
|
||||
options.Objects[i]:=if_(listbox.Checked[i], PTR1, NIL);
|
||||
result:=TRUE;
|
||||
finally dlg.free end;
|
||||
end;
|
||||
|
||||
end.
|
||||
78
longinputDlg.dfm
Normal file
78
longinputDlg.dfm
Normal file
@ -0,0 +1,78 @@
|
||||
object longinputFrm: TlonginputFrm
|
||||
Left = 191
|
||||
Top = 187
|
||||
BorderStyle = bsSizeToolWin
|
||||
Caption = 'longinputFrm'
|
||||
ClientHeight = 314
|
||||
ClientWidth = 465
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
Position = poMainFormCenter
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object bottomPnl: TPanel
|
||||
Left = 0
|
||||
Top = 282
|
||||
Width = 465
|
||||
Height = 32
|
||||
Align = alBottom
|
||||
BevelOuter = bvNone
|
||||
TabOrder = 1
|
||||
OnResize = bottomPnlResize
|
||||
object okBtn: TButton
|
||||
Left = 55
|
||||
Top = 4
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '&OK'
|
||||
Default = True
|
||||
ModalResult = 1
|
||||
TabOrder = 0
|
||||
end
|
||||
object cancelBtn: TButton
|
||||
Left = 135
|
||||
Top = 4
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '&Cancel'
|
||||
ModalResult = 2
|
||||
TabOrder = 1
|
||||
end
|
||||
end
|
||||
object topPnl: TPanel
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 465
|
||||
Height = 41
|
||||
Align = alTop
|
||||
BevelOuter = bvNone
|
||||
TabOrder = 2
|
||||
object msgLbl: TLabel
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 17
|
||||
Height = 13
|
||||
Align = alClient
|
||||
Caption = 'test'
|
||||
Layout = tlCenter
|
||||
WordWrap = True
|
||||
end
|
||||
end
|
||||
object inputBox: TMemo
|
||||
Left = 0
|
||||
Top = 41
|
||||
Width = 465
|
||||
Height = 241
|
||||
Align = alClient
|
||||
Lines.Strings = (
|
||||
'Memo1')
|
||||
ScrollBars = ssVertical
|
||||
TabOrder = 0
|
||||
OnKeyDown = inputBoxKeyDown
|
||||
end
|
||||
end
|
||||
44
longinputDlg.pas
Normal file
44
longinputDlg.pas
Normal file
@ -0,0 +1,44 @@
|
||||
unit longinputDlg;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, StdCtrls, ExtCtrls;
|
||||
|
||||
type
|
||||
TlonginputFrm = class(TForm)
|
||||
bottomPnl: TPanel;
|
||||
okBtn: TButton;
|
||||
cancelBtn: TButton;
|
||||
topPnl: TPanel;
|
||||
msgLbl: TLabel;
|
||||
inputBox: TMemo;
|
||||
procedure bottomPnlResize(Sender: TObject);
|
||||
procedure inputBoxKeyDown(Sender: TObject; var Key: Word;
|
||||
Shift: TShiftState);
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
procedure TlonginputFrm.bottomPnlResize(Sender: TObject);
|
||||
begin
|
||||
okBtn.left:=(bottomPnl.Width-cancelBtn.BoundsRect.right+okBtn.BoundsRect.left) div 2;
|
||||
cancelBtn.left:=okBtn.BoundsRect.Right+10;
|
||||
end;
|
||||
|
||||
procedure TlonginputFrm.inputBoxKeyDown(Sender: TObject; var Key: Word;
|
||||
Shift: TShiftState);
|
||||
begin
|
||||
if shift = [ssCtrl] then
|
||||
if key = ord('A') then
|
||||
inputBox.SelectAll();
|
||||
end;
|
||||
|
||||
end.
|
||||
518
macros-log.html
Normal file
518
macros-log.html
Normal file
File diff suppressed because one or more lines are too long
110
monoLib.pas
Normal file
110
monoLib.pas
Normal file
@ -0,0 +1,110 @@
|
||||
{
|
||||
Copyright (C) 2002-2008 Massimo Melina (www.rejetto.com)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
This lib ensures only one instance of the software does run
|
||||
}
|
||||
unit monoLib;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
windows, messages, forms, classes, sysUtils;
|
||||
|
||||
type
|
||||
Tmono = class
|
||||
private
|
||||
msgID: Thandle;
|
||||
Fmaster: boolean;
|
||||
Ferror: string;
|
||||
Fworking: boolean;
|
||||
function hook(var msg:TMessage):boolean;
|
||||
public
|
||||
onSlaveParams: procedure(params:string);
|
||||
property error:string read Ferror;
|
||||
property master:boolean read Fmaster;
|
||||
property working:boolean read Fworking;
|
||||
|
||||
function init(id:string):boolean; // FALSE on error
|
||||
procedure sendParams();
|
||||
end;
|
||||
|
||||
var
|
||||
mono: Tmono;
|
||||
initialPath: string;
|
||||
|
||||
implementation
|
||||
|
||||
const
|
||||
//MSG_WHEREAREYOU = 1;
|
||||
//MSG_HEREIAM = 2;
|
||||
MSG_PARAMS = 3;
|
||||
|
||||
function atomToStr(atom:Tatom):string;
|
||||
begin
|
||||
setlength(result, 5000);
|
||||
setlength(result, globalGetAtomName(atom, @result[1], length(result)));
|
||||
end; // atomToStr
|
||||
|
||||
function Tmono.hook(var msg:TMessage):boolean;
|
||||
begin
|
||||
result:=master and (msg.msg = msgID) and (msg.wparam = MSG_PARAMS);
|
||||
if not result or not assigned(onSlaveParams) then exit;
|
||||
msg.Result:=1;
|
||||
onSlaveParams(atomToStr(msg.lparam));
|
||||
GlobalDeleteAtom(msg.LParam);
|
||||
end; // hook
|
||||
|
||||
function Tmono.init(id:string):boolean;
|
||||
begin
|
||||
result:=FALSE;
|
||||
msgID:=registerWindowMessage(pchar(id));
|
||||
application.HookMainWindow(hook);
|
||||
// the mutex is auto-released when the application terminates
|
||||
if createMutex(nil, True, pchar(id)) = 0 then
|
||||
begin
|
||||
setlength(Ferror,1000);
|
||||
setlength(Ferror, FormatMessage(
|
||||
FORMAT_MESSAGE_FROM_SYSTEM+FORMAT_MESSAGE_IGNORE_INSERTS, NIL,
|
||||
GetLastError(), 0, @Ferror[1], length(Ferror), NIL) );
|
||||
exit;
|
||||
end;
|
||||
Fmaster:= GetLastError() <> ERROR_ALREADY_EXISTS;
|
||||
Fworking:=TRUE;
|
||||
result:=TRUE;
|
||||
end; // init
|
||||
|
||||
procedure Tmono.sendParams();
|
||||
var
|
||||
s: string;
|
||||
i: integer;
|
||||
begin
|
||||
s:=initialPath+#13+paramStr(0);
|
||||
for i:=1 to paramCount() do
|
||||
s:=s+#13+paramStr(i);
|
||||
// the master will delete the atom
|
||||
postMessage(HWND_BROADCAST, msgId, MSG_PARAMS, globalAddAtom(pchar(s)));
|
||||
end; // sendParams
|
||||
|
||||
initialization
|
||||
initialPath:=getCurrentDir();
|
||||
mono:=Tmono.create;
|
||||
|
||||
finalization
|
||||
mono.free;
|
||||
|
||||
end.
|
||||
73
newuserpassDlg.dfm
Normal file
73
newuserpassDlg.dfm
Normal file
@ -0,0 +1,73 @@
|
||||
object newuserpassFrm: TnewuserpassFrm
|
||||
Left = 362
|
||||
Top = 207
|
||||
BorderStyle = bsDialog
|
||||
Caption = 'Insert the requested user/pass'
|
||||
ClientHeight = 131
|
||||
ClientWidth = 302
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
Position = poMainFormCenter
|
||||
OnShow = FormShow
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object userBox: TLabeledEdit
|
||||
Left = 104
|
||||
Top = 16
|
||||
Width = 121
|
||||
Height = 21
|
||||
EditLabel.Width = 48
|
||||
EditLabel.Height = 13
|
||||
EditLabel.Caption = 'Username'
|
||||
LabelPosition = lpLeft
|
||||
TabOrder = 0
|
||||
end
|
||||
object pwdBox: TLabeledEdit
|
||||
Left = 104
|
||||
Top = 40
|
||||
Width = 121
|
||||
Height = 21
|
||||
EditLabel.Width = 46
|
||||
EditLabel.Height = 13
|
||||
EditLabel.Caption = 'Password'
|
||||
LabelPosition = lpLeft
|
||||
PasswordChar = '*'
|
||||
TabOrder = 1
|
||||
end
|
||||
object pwd2Box: TLabeledEdit
|
||||
Left = 104
|
||||
Top = 64
|
||||
Width = 121
|
||||
Height = 21
|
||||
EditLabel.Width = 85
|
||||
EditLabel.Height = 13
|
||||
EditLabel.Caption = 'Re-type password'
|
||||
LabelPosition = lpLeft
|
||||
PasswordChar = '*'
|
||||
TabOrder = 2
|
||||
end
|
||||
object okBtn: TButton
|
||||
Left = 104
|
||||
Top = 96
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '&Ok'
|
||||
Default = True
|
||||
TabOrder = 3
|
||||
OnClick = okBtnClick
|
||||
end
|
||||
object resetBtn: TButton
|
||||
Left = 192
|
||||
Top = 96
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '&Reset'
|
||||
TabOrder = 4
|
||||
OnClick = resetBtnClick
|
||||
end
|
||||
end
|
||||
90
newuserpassDlg.pas
Normal file
90
newuserpassDlg.pas
Normal file
@ -0,0 +1,90 @@
|
||||
{
|
||||
Copyright (C) 2002-2012 Massimo Melina (www.rejetto.com)
|
||||
|
||||
This file is part of HFS ~ HTTP File Server.
|
||||
|
||||
HFS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
HFS is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with HFS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
}
|
||||
unit newuserpassDlg;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, StdCtrls, ExtCtrls, utilLib;
|
||||
|
||||
type
|
||||
TnewuserpassFrm = class(TForm)
|
||||
userBox: TLabeledEdit;
|
||||
pwdBox: TLabeledEdit;
|
||||
pwd2Box: TLabeledEdit;
|
||||
okBtn: TButton;
|
||||
resetBtn: TButton;
|
||||
procedure okBtnClick(Sender: TObject);
|
||||
procedure resetBtnClick(Sender: TObject);
|
||||
procedure FormShow(Sender: TObject);
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
function prompt(var usr,pwd:string):boolean;
|
||||
end;
|
||||
|
||||
var
|
||||
newuserpassFrm: TnewuserpassFrm;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
procedure TnewuserpassFrm.okBtnClick(Sender: TObject);
|
||||
var
|
||||
error: string;
|
||||
begin
|
||||
userBox.text:=trim(userBox.text);
|
||||
pwdBox.text:=trim(pwdBox.text);
|
||||
error:='';
|
||||
if (userBox.text > '') and not validUsername(userBox.Text)
|
||||
or (pwdBox.text > '') and not validUsername(pwdBox.text) then
|
||||
error:='The characters below are not allowed'#13'/\:?*"<>|;&&@'
|
||||
else if (pwdBox.text > '') and (userBox.text = '') then
|
||||
error:='User is mandatory'
|
||||
else if pwdBox.text <> pwd2Box.text then
|
||||
error:='The two passwords you entered don''t match';
|
||||
|
||||
if error = '' then ModalResult:=mrOk
|
||||
else msgDlg(error, MB_ICONERROR);
|
||||
end;
|
||||
|
||||
procedure TnewuserpassFrm.resetBtnClick(Sender: TObject);
|
||||
begin
|
||||
userBox.text:='';
|
||||
pwdBox.text:='';
|
||||
pwd2Box.text:='';
|
||||
end;
|
||||
|
||||
procedure TnewuserpassFrm.FormShow(Sender: TObject);
|
||||
begin userBox.SetFocus() end;
|
||||
|
||||
function TnewuserpassFrm.prompt(var usr,pwd:string):boolean;
|
||||
begin
|
||||
userBox.Text:=usr;
|
||||
pwdBox.text:=pwd;
|
||||
pwd2Box.text:=pwd;
|
||||
result:= ShowModal() = mrOk;
|
||||
usr:=userBox.Text;
|
||||
pwd:=pwdBox.text;
|
||||
end;
|
||||
|
||||
end.
|
||||
62
notes.txt
Normal file
62
notes.txt
Normal file
@ -0,0 +1,62 @@
|
||||
=== 4GB+ FILES DOWNLOAD SUPPORT
|
||||
Reget Deluxe 4.1
|
||||
MetaProducts Download Express 1.7
|
||||
Getright
|
||||
Firefox 2.0
|
||||
|
||||
=== 2GB+ FILES UPLOAD SUPPORT
|
||||
firefox 3.0: no
|
||||
|
||||
=== HOW TO CREATE BIG FILES
|
||||
fsutil file createnew <filename> <filesize>
|
||||
|
||||
=== HOW TO DOWNLOAD WITH NO DISK ACTIVITY (SPEED TEST)
|
||||
create a big file as above
|
||||
then download this way: wget -q -O nul http://localhost/big
|
||||
|
||||
=== SUBMITTED TO
|
||||
www.nonags.com
|
||||
www.sharewareconnection.com
|
||||
|
||||
=== LISTED ON
|
||||
www.sofotex.com
|
||||
www.download3000.com
|
||||
www.onekit.com
|
||||
www.all4you.dk/FreewareWorld
|
||||
www.snapfiles.com
|
||||
sourceforge
|
||||
www.freedownloadscenter.com
|
||||
download.freenet.de
|
||||
www.softonic.com
|
||||
www.portablefreeware.com
|
||||
www.download.com
|
||||
www.freewarepub.org
|
||||
www.handyarchive.com
|
||||
www.softpedia.com
|
||||
www.acidfiles.com
|
||||
www.fileedge.com
|
||||
www.freewarepark.com
|
||||
|
||||
=== REVIEWS
|
||||
http://www.technospot.net/blogs/host-a-web-server-on-your-home-pc/
|
||||
http://www.snapfiles.com/get/hfs.html
|
||||
http://www.downloadsquad.com/2006/05/24/hft-quick-and-easy-http-file-server/
|
||||
http://www.caseytech.com/how-to-host-a-web-site-from-your-computer/
|
||||
http://www.chip.de/downloads/c1_downloads_29480524.html
|
||||
http://blog.pcserenity.com/2009/01/easy-conten-sharing-with-windows.html
|
||||
http://hfs.onehelp.ch
|
||||
http://www.lanacion.com.ar/nota.asp?nota_id=1148507
|
||||
http://blogmotion.fr/systeme/partage-windows-hfs-3947
|
||||
ita
|
||||
http://lafabbricadibyte.wordpress.com/2007/05/01/hfs-file-server-http-gratuito-per-windows/
|
||||
http://server.html.it/articoli/leggi/2335/hfs-file-sharing-via-http/
|
||||
|
||||
=== OTHER SOFTWARE BASED ON HFS
|
||||
http://www.wrinx.com/products/pfs/
|
||||
commercial, licensed
|
||||
http://www.powernetservers.com/pnwfs.php
|
||||
commercial, probably unlicensed
|
||||
|
||||
=== INSTALLABLE PLUGINS
|
||||
log links usage
|
||||
http://www.rejetto.com/forum/index.php/topic,7765.msg1047258.html#msg1047258
|
||||
691
optionsDlg.dfm
Normal file
691
optionsDlg.dfm
Normal file
@ -0,0 +1,691 @@
|
||||
object optionsFrm: ToptionsFrm
|
||||
Left = 287
|
||||
Top = 162
|
||||
BorderIcons = [biSystemMenu, biMinimize]
|
||||
Caption = 'Options'
|
||||
ClientHeight = 449
|
||||
ClientWidth = 805
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
Position = poMainFormCenter
|
||||
OnActivate = FormActivate
|
||||
OnCreate = FormCreate
|
||||
OnResize = FormResize
|
||||
OnShow = FormShow
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 14
|
||||
object pageCtrl: TPageControl
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 805
|
||||
Height = 414
|
||||
ActivePage = accountsPage
|
||||
Align = alClient
|
||||
Images = mainFrm.images
|
||||
MultiLine = True
|
||||
TabOrder = 0
|
||||
object bansPage: TTabSheet
|
||||
Caption = 'Bans'
|
||||
ImageIndex = 25
|
||||
ExplicitLeft = 0
|
||||
ExplicitTop = 0
|
||||
ExplicitWidth = 0
|
||||
ExplicitHeight = 0
|
||||
object Panel1: TPanel
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 797
|
||||
Height = 30
|
||||
Align = alTop
|
||||
BevelOuter = bvNone
|
||||
TabOrder = 0
|
||||
object addBtn: TButton
|
||||
Left = 4
|
||||
Top = 5
|
||||
Width = 73
|
||||
Height = 21
|
||||
Caption = 'Add row'
|
||||
TabOrder = 0
|
||||
OnClick = addBtnClick
|
||||
end
|
||||
object deleteBtn: TButton
|
||||
Left = 86
|
||||
Top = 5
|
||||
Width = 73
|
||||
Height = 21
|
||||
Caption = 'Delete row'
|
||||
TabOrder = 1
|
||||
OnClick = deleteBtnClick
|
||||
end
|
||||
object sortBanBtn: TButton
|
||||
Left = 168
|
||||
Top = 5
|
||||
Width = 73
|
||||
Height = 21
|
||||
Caption = 'Sort'
|
||||
TabOrder = 2
|
||||
OnClick = sortBanBtnClick
|
||||
end
|
||||
end
|
||||
object bansBox: TValueListEditor
|
||||
Left = 0
|
||||
Top = 30
|
||||
Width = 797
|
||||
Height = 329
|
||||
Align = alClient
|
||||
KeyOptions = [keyEdit, keyAdd, keyDelete]
|
||||
Strings.Strings = (
|
||||
'=')
|
||||
TabOrder = 1
|
||||
TitleCaptions.Strings = (
|
||||
'IP address mask'
|
||||
'Comment')
|
||||
ColWidths = (
|
||||
108
|
||||
683)
|
||||
end
|
||||
object Panel3: TPanel
|
||||
Left = 0
|
||||
Top = 359
|
||||
Width = 797
|
||||
Height = 26
|
||||
Align = alBottom
|
||||
BevelOuter = bvNone
|
||||
TabOrder = 2
|
||||
object noreplybanChk: TCheckBox
|
||||
Left = 5
|
||||
Top = 5
|
||||
Width = 145
|
||||
Height = 17
|
||||
Caption = 'Disconnect with no reply'
|
||||
TabOrder = 0
|
||||
end
|
||||
object Button1: TButton
|
||||
Left = 176
|
||||
Top = 4
|
||||
Width = 141
|
||||
Height = 19
|
||||
Caption = 'How to invert the logic?'
|
||||
TabOrder = 1
|
||||
OnClick = Button1Click
|
||||
end
|
||||
end
|
||||
end
|
||||
object accountsPage: TTabSheet
|
||||
Caption = 'Accounts'
|
||||
ImageIndex = 29
|
||||
ExplicitLeft = 0
|
||||
ExplicitTop = 0
|
||||
ExplicitWidth = 0
|
||||
ExplicitHeight = 0
|
||||
DesignSize = (
|
||||
797
|
||||
385)
|
||||
object Label1: TLabel
|
||||
Left = 9
|
||||
Top = 16
|
||||
Width = 57
|
||||
Height = 14
|
||||
Caption = 'Account list'
|
||||
FocusControl = accountsBox
|
||||
end
|
||||
object Label7: TLabel
|
||||
Left = 251
|
||||
Top = 349
|
||||
Width = 299
|
||||
Height = 28
|
||||
Hint = 'You also need to right click on the folder, then restrict access'
|
||||
Anchors = [akLeft, akBottom]
|
||||
Caption =
|
||||
'WARNING: creating an account is not enough to protect your file' +
|
||||
's...'
|
||||
ParentShowHint = False
|
||||
ShowHint = True
|
||||
WordWrap = True
|
||||
end
|
||||
object accountpropGrp: TGroupBox
|
||||
Left = 163
|
||||
Top = 26
|
||||
Width = 619
|
||||
Height = 317
|
||||
Anchors = [akLeft, akTop, akRight, akBottom]
|
||||
Caption = 'Account properties'
|
||||
TabOrder = 7
|
||||
ExplicitHeight = 318
|
||||
DesignSize = (
|
||||
619
|
||||
317)
|
||||
object Label3: TLabel
|
||||
Left = 11
|
||||
Top = 173
|
||||
Width = 257
|
||||
Height = 28
|
||||
Caption = 'Here you can see protected resources this user can access...'
|
||||
FocusControl = accountAccessBox
|
||||
WordWrap = True
|
||||
end
|
||||
object Label8: TLabel
|
||||
Left = 336
|
||||
Top = 20
|
||||
Width = 28
|
||||
Height = 14
|
||||
Caption = 'Notes'
|
||||
FocusControl = notesBox
|
||||
WordWrap = True
|
||||
end
|
||||
object accountenabledChk: TCheckBox
|
||||
Left = 11
|
||||
Top = 20
|
||||
Width = 97
|
||||
Height = 17
|
||||
Caption = '&Enabled'
|
||||
TabOrder = 0
|
||||
OnClick = accountenabledChkClick
|
||||
end
|
||||
object accountAccessBox: TTreeView
|
||||
Left = 11
|
||||
Top = 192
|
||||
Width = 302
|
||||
Height = 116
|
||||
Anchors = [akLeft, akTop, akBottom]
|
||||
Images = mainFrm.images
|
||||
Indent = 19
|
||||
ParentShowHint = False
|
||||
ReadOnly = True
|
||||
ShowHint = False
|
||||
ShowRoot = False
|
||||
TabOrder = 7
|
||||
OnContextPopup = accountAccessBoxContextPopup
|
||||
OnDblClick = accountAccessBoxDblClick
|
||||
ExplicitHeight = 117
|
||||
end
|
||||
object ignoreLimitsChk: TCheckBox
|
||||
Left = 226
|
||||
Top = 20
|
||||
Width = 97
|
||||
Height = 17
|
||||
Caption = '&Ignore limits'
|
||||
TabOrder = 2
|
||||
end
|
||||
object pwdBox: TLabeledEdit
|
||||
Left = 11
|
||||
Top = 63
|
||||
Width = 198
|
||||
Height = 21
|
||||
EditLabel.Width = 50
|
||||
EditLabel.Height = 14
|
||||
EditLabel.Caption = '&Password'
|
||||
PasswordChar = '*'
|
||||
TabOrder = 3
|
||||
OnEnter = pwdBoxEnter
|
||||
OnExit = pwdBoxExit
|
||||
end
|
||||
object redirBox: TLabeledEdit
|
||||
Left = 11
|
||||
Top = 106
|
||||
Width = 198
|
||||
Height = 21
|
||||
EditLabel.Width = 111
|
||||
EditLabel.Height = 14
|
||||
EditLabel.Caption = 'After ~login, redirect to'
|
||||
TabOrder = 4
|
||||
OnChange = redirBoxChange
|
||||
end
|
||||
object accountLinkBox: TLabeledEdit
|
||||
Left = 11
|
||||
Top = 146
|
||||
Width = 198
|
||||
Height = 21
|
||||
EditLabel.Width = 51
|
||||
EditLabel.Height = 14
|
||||
EditLabel.Caption = 'Member of'
|
||||
TabOrder = 5
|
||||
OnExit = accountLinkBoxExit
|
||||
end
|
||||
object groupChk: TCheckBox
|
||||
Left = 114
|
||||
Top = 20
|
||||
Width = 97
|
||||
Height = 17
|
||||
Caption = '&Group'
|
||||
TabOrder = 1
|
||||
OnClick = groupChkClick
|
||||
end
|
||||
object groupsBtn: TButton
|
||||
Left = 215
|
||||
Top = 146
|
||||
Width = 90
|
||||
Height = 21
|
||||
Caption = 'Choose...'
|
||||
TabOrder = 6
|
||||
OnClick = groupsBtnClick
|
||||
end
|
||||
object notesBox: TMemo
|
||||
Left = 345
|
||||
Top = 39
|
||||
Width = 271
|
||||
Height = 269
|
||||
Anchors = [akLeft, akTop, akRight, akBottom]
|
||||
ParentShowHint = False
|
||||
ScrollBars = ssVertical
|
||||
ShowHint = False
|
||||
TabOrder = 8
|
||||
ExplicitHeight = 270
|
||||
end
|
||||
object notesWrapChk: TCheckBox
|
||||
Left = 502
|
||||
Top = 21
|
||||
Width = 91
|
||||
Height = 17
|
||||
Anchors = [akTop, akRight]
|
||||
Caption = 'Wrap'
|
||||
Checked = True
|
||||
State = cbChecked
|
||||
TabOrder = 9
|
||||
OnClick = notesWrapChkClick
|
||||
end
|
||||
end
|
||||
object deleteaccountBtn: TButton
|
||||
Left = 3
|
||||
Top = 351
|
||||
Width = 45
|
||||
Height = 17
|
||||
Anchors = [akLeft, akBottom]
|
||||
Caption = 'de&lete'
|
||||
Enabled = False
|
||||
Font.Charset = ANSI_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
TabOrder = 2
|
||||
OnClick = deleteaccountBtnClick
|
||||
ExplicitTop = 352
|
||||
end
|
||||
object renaccountBtn: TButton
|
||||
Left = 53
|
||||
Top = 328
|
||||
Width = 49
|
||||
Height = 17
|
||||
Anchors = [akLeft, akBottom]
|
||||
Caption = '&rename'
|
||||
Enabled = False
|
||||
Font.Charset = ANSI_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
TabOrder = 3
|
||||
OnClick = renaccountBtnClick
|
||||
ExplicitTop = 329
|
||||
end
|
||||
object addaccountBtn: TButton
|
||||
Left = 3
|
||||
Top = 328
|
||||
Width = 45
|
||||
Height = 17
|
||||
Anchors = [akLeft, akBottom]
|
||||
Caption = 'ad&d'
|
||||
Font.Charset = ANSI_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
TabOrder = 1
|
||||
OnClick = addaccountBtnClick
|
||||
ExplicitTop = 329
|
||||
end
|
||||
object upBtn: TButton
|
||||
Left = 107
|
||||
Top = 328
|
||||
Width = 45
|
||||
Height = 17
|
||||
Anchors = [akLeft, akBottom]
|
||||
Caption = '&up'
|
||||
Font.Charset = ANSI_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
TabOrder = 5
|
||||
OnClick = upBtnClick
|
||||
OnMouseUp = upBtnMouseUp
|
||||
ExplicitTop = 329
|
||||
end
|
||||
object downBtn: TButton
|
||||
Left = 107
|
||||
Top = 351
|
||||
Width = 45
|
||||
Height = 17
|
||||
Anchors = [akLeft, akBottom]
|
||||
Caption = 'do&wn'
|
||||
Font.Charset = ANSI_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
TabOrder = 6
|
||||
OnClick = upBtnClick
|
||||
OnMouseUp = upBtnMouseUp
|
||||
ExplicitTop = 352
|
||||
end
|
||||
object sortBtn: TButton
|
||||
Left = 53
|
||||
Top = 351
|
||||
Width = 49
|
||||
Height = 17
|
||||
Anchors = [akLeft, akBottom]
|
||||
Caption = 'sort'
|
||||
Font.Charset = ANSI_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
TabOrder = 4
|
||||
OnClick = sortBtnClick
|
||||
OnMouseUp = upBtnMouseUp
|
||||
ExplicitTop = 352
|
||||
end
|
||||
object accountsBox: TListView
|
||||
Left = 3
|
||||
Top = 35
|
||||
Width = 149
|
||||
Height = 287
|
||||
Anchors = [akLeft, akTop, akBottom]
|
||||
Columns = <>
|
||||
DragMode = dmAutomatic
|
||||
HideSelection = False
|
||||
OwnerData = True
|
||||
RowSelect = True
|
||||
ParentShowHint = False
|
||||
ShowHint = False
|
||||
SmallImages = mainFrm.images
|
||||
TabOrder = 0
|
||||
ViewStyle = vsList
|
||||
OnChange = accountsBoxChange
|
||||
OnClick = accountsBoxClick
|
||||
OnData = accountsBoxData
|
||||
OnDblClick = accountsBoxDblClick
|
||||
OnEdited = accountsBoxEdited
|
||||
OnEditing = accountsBoxEditing
|
||||
OnDragDrop = accountsBoxDragDrop
|
||||
OnDragOver = accountsBoxDragOver
|
||||
OnKeyDown = accountsBoxKeyDown
|
||||
OnKeyPress = accountsBoxKeyPress
|
||||
ExplicitHeight = 288
|
||||
end
|
||||
end
|
||||
object mimePage: TTabSheet
|
||||
Caption = 'MIME types'
|
||||
ImageIndex = 7
|
||||
ExplicitLeft = 0
|
||||
ExplicitTop = 0
|
||||
ExplicitWidth = 0
|
||||
ExplicitHeight = 0
|
||||
object mimeBox: TValueListEditor
|
||||
Left = 0
|
||||
Top = 30
|
||||
Width = 797
|
||||
Height = 355
|
||||
Align = alClient
|
||||
KeyOptions = [keyEdit, keyAdd, keyDelete]
|
||||
Strings.Strings = (
|
||||
'=')
|
||||
TabOrder = 0
|
||||
TitleCaptions.Strings = (
|
||||
'File Mask'
|
||||
'MIME Description')
|
||||
ColWidths = (
|
||||
108
|
||||
683)
|
||||
end
|
||||
object Panel5: TPanel
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 797
|
||||
Height = 30
|
||||
Align = alTop
|
||||
BevelOuter = bvNone
|
||||
TabOrder = 1
|
||||
object addMimeBtn: TButton
|
||||
Left = 4
|
||||
Top = 5
|
||||
Width = 73
|
||||
Height = 21
|
||||
Caption = 'Add row'
|
||||
TabOrder = 0
|
||||
OnClick = addMimeBtnClick
|
||||
end
|
||||
object deleteMimeBtn: TButton
|
||||
Left = 86
|
||||
Top = 5
|
||||
Width = 73
|
||||
Height = 21
|
||||
Caption = 'Delete row'
|
||||
TabOrder = 1
|
||||
OnClick = deleteMimeBtnClick
|
||||
end
|
||||
object inBrowserIfMIMEchk: TCheckBox
|
||||
Left = 184
|
||||
Top = 7
|
||||
Width = 305
|
||||
Height = 17
|
||||
Caption = 'Open directly in browser when MIME type is defined'
|
||||
TabOrder = 2
|
||||
end
|
||||
end
|
||||
end
|
||||
object trayPage: TTabSheet
|
||||
Caption = 'Tray Message'
|
||||
ImageIndex = 10
|
||||
ExplicitLeft = 0
|
||||
ExplicitTop = 0
|
||||
ExplicitWidth = 0
|
||||
ExplicitHeight = 0
|
||||
object Label2: TLabel
|
||||
Left = 8
|
||||
Top = 16
|
||||
Width = 292
|
||||
Height = 168
|
||||
Caption =
|
||||
'You can customize the message in the tray icon tip. '#13#10'The messag' +
|
||||
'e length is determined by your Windows version'#13#10'(in XP the limit' +
|
||||
' is 127 characters including spaces).'#13#10'Available symbols:'#13#10#13#10' %' +
|
||||
'uptime% - server uptime'#13#10' %url% - server main URL'#13#10' %ip% - IP ' +
|
||||
'address set as default'#13#10' %port% - Port on which the server is l' +
|
||||
'istening'#13#10' %hits% - number of requests made to the server'#13#10' %d' +
|
||||
'ownloads% - number of files downloaded'#13#10' %version% - HFS versio' +
|
||||
'n'
|
||||
end
|
||||
object Label10: TLabel
|
||||
Left = 264
|
||||
Top = 157
|
||||
Width = 40
|
||||
Height = 14
|
||||
Caption = 'Preview'
|
||||
end
|
||||
object traymsgBox: TMemo
|
||||
Left = 16
|
||||
Top = 176
|
||||
Width = 233
|
||||
Height = 121
|
||||
Lines.Strings = (
|
||||
'traymsgBox')
|
||||
TabOrder = 0
|
||||
OnChange = traymsgBoxChange
|
||||
end
|
||||
object traypreviewBox: TMemo
|
||||
Left = 264
|
||||
Top = 176
|
||||
Width = 233
|
||||
Height = 121
|
||||
Color = clInfoBk
|
||||
ReadOnly = True
|
||||
TabOrder = 1
|
||||
end
|
||||
end
|
||||
object a2nPage: TTabSheet
|
||||
Caption = 'Address2name'
|
||||
ImageIndex = -1
|
||||
ExplicitLeft = 0
|
||||
ExplicitTop = 0
|
||||
ExplicitWidth = 0
|
||||
ExplicitHeight = 0
|
||||
object Panel4: TPanel
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 797
|
||||
Height = 67
|
||||
Align = alTop
|
||||
Alignment = taLeftJustify
|
||||
BevelOuter = bvNone
|
||||
TabOrder = 0
|
||||
object Label4: TLabel
|
||||
Left = 8
|
||||
Top = 8
|
||||
Width = 243
|
||||
Height = 28
|
||||
Caption =
|
||||
'You can associate a label to an address (or many addresses). It ' +
|
||||
'will be used in the log.'
|
||||
WordWrap = True
|
||||
end
|
||||
object deleteA2Nbtn: TButton
|
||||
Left = 83
|
||||
Top = 40
|
||||
Width = 73
|
||||
Height = 21
|
||||
Caption = '&Delete row'
|
||||
TabOrder = 0
|
||||
OnClick = deleteA2NbtnClick
|
||||
end
|
||||
object addA2Nbtn: TButton
|
||||
Left = 4
|
||||
Top = 41
|
||||
Width = 73
|
||||
Height = 21
|
||||
Caption = 'Add &row'
|
||||
TabOrder = 1
|
||||
OnClick = addA2NbtnClick
|
||||
end
|
||||
end
|
||||
object a2nBox: TValueListEditor
|
||||
Left = 0
|
||||
Top = 67
|
||||
Width = 797
|
||||
Height = 318
|
||||
Align = alClient
|
||||
KeyOptions = [keyEdit, keyAdd, keyDelete]
|
||||
Strings.Strings = (
|
||||
'=')
|
||||
TabOrder = 1
|
||||
TitleCaptions.Strings = (
|
||||
'Name'
|
||||
'IP Mask')
|
||||
ColWidths = (
|
||||
108
|
||||
683)
|
||||
end
|
||||
end
|
||||
object iconsPage: TTabSheet
|
||||
Caption = 'Icon masks'
|
||||
ImageIndex = -1
|
||||
ExplicitLeft = 0
|
||||
ExplicitTop = 0
|
||||
ExplicitWidth = 0
|
||||
ExplicitHeight = 0
|
||||
DesignSize = (
|
||||
797
|
||||
385)
|
||||
object Label5: TLabel
|
||||
Left = 8
|
||||
Top = 32
|
||||
Width = 207
|
||||
Height = 28
|
||||
Caption = 'Each line is a file-mask associated with an icon'
|
||||
WordWrap = True
|
||||
end
|
||||
object Label6: TLabel
|
||||
Left = 272
|
||||
Top = 128
|
||||
Width = 76
|
||||
Height = 14
|
||||
Caption = 'Icon associated'
|
||||
end
|
||||
object iconMasksBox: TMemo
|
||||
Left = 8
|
||||
Top = 48
|
||||
Width = 225
|
||||
Height = 245
|
||||
Anchors = [akLeft, akTop, akBottom]
|
||||
TabOrder = 0
|
||||
OnChange = iconMasksBoxChange
|
||||
ExplicitHeight = 246
|
||||
end
|
||||
object iconsBox: TComboBox
|
||||
Left = 272
|
||||
Top = 144
|
||||
Width = 76
|
||||
Height = 22
|
||||
Style = csOwnerDrawFixed
|
||||
TabOrder = 1
|
||||
OnChange = iconsBoxChange
|
||||
OnDrawItem = iconsBoxDrawItem
|
||||
OnDropDown = iconsBoxDropDown
|
||||
end
|
||||
end
|
||||
end
|
||||
object Panel2: TPanel
|
||||
Left = 0
|
||||
Top = 414
|
||||
Width = 805
|
||||
Height = 35
|
||||
Align = alBottom
|
||||
BevelOuter = bvNone
|
||||
TabOrder = 1
|
||||
DesignSize = (
|
||||
805
|
||||
35)
|
||||
object okBtn: TButton
|
||||
Left = 561
|
||||
Top = 6
|
||||
Width = 75
|
||||
Height = 25
|
||||
Anchors = [akRight, akBottom]
|
||||
Caption = '&OK'
|
||||
TabOrder = 0
|
||||
OnClick = okBtnClick
|
||||
end
|
||||
object applyBtn: TButton
|
||||
Left = 725
|
||||
Top = 6
|
||||
Width = 75
|
||||
Height = 25
|
||||
Anchors = [akRight, akBottom]
|
||||
Caption = '&Apply'
|
||||
TabOrder = 1
|
||||
OnClick = applyBtnClick
|
||||
end
|
||||
object cancelBtn: TButton
|
||||
Left = 643
|
||||
Top = 6
|
||||
Width = 75
|
||||
Height = 25
|
||||
Anchors = [akRight, akBottom]
|
||||
Caption = '&Cancel'
|
||||
TabOrder = 2
|
||||
OnClick = cancelBtnClick
|
||||
end
|
||||
end
|
||||
end
|
||||
954
optionsDlg.pas
Normal file
954
optionsDlg.pas
Normal file
@ -0,0 +1,954 @@
|
||||
{
|
||||
Copyright (C) 2002-2012 Massimo Melina (www.rejetto.com)
|
||||
|
||||
This file is part of HFS ~ HTTP File Server.
|
||||
|
||||
HFS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
HFS is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with HFS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
}
|
||||
unit optionsDlg;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Math,
|
||||
Dialogs, ExtCtrls, StdCtrls, Grids, ComCtrls, ValEdit, types, main, CheckLst;
|
||||
|
||||
type
|
||||
ToptionsFrm = class(TForm)
|
||||
pageCtrl: TPageControl;
|
||||
bansPage: TTabSheet;
|
||||
accountsPage: TTabSheet;
|
||||
accountpropGrp: TGroupBox;
|
||||
accountenabledChk: TCheckBox;
|
||||
pwdBox: TLabeledEdit;
|
||||
Label1: TLabel;
|
||||
deleteaccountBtn: TButton;
|
||||
renaccountBtn: TButton;
|
||||
mimePage: TTabSheet;
|
||||
mimeBox: TValueListEditor;
|
||||
trayPage: TTabSheet;
|
||||
Label2: TLabel;
|
||||
traymsgBox: TMemo;
|
||||
Panel1: TPanel;
|
||||
Label3: TLabel;
|
||||
accountAccessBox: TTreeView;
|
||||
Panel2: TPanel;
|
||||
okBtn: TButton;
|
||||
applyBtn: TButton;
|
||||
cancelBtn: TButton;
|
||||
bansBox: TValueListEditor;
|
||||
addBtn: TButton;
|
||||
deleteBtn: TButton;
|
||||
Panel3: TPanel;
|
||||
noreplybanChk: TCheckBox;
|
||||
Button1: TButton;
|
||||
a2nPage: TTabSheet;
|
||||
Panel4: TPanel;
|
||||
Label4: TLabel;
|
||||
a2nBox: TValueListEditor;
|
||||
ignoreLimitsChk: TCheckBox;
|
||||
Panel5: TPanel;
|
||||
addMimeBtn: TButton;
|
||||
deleteMimeBtn: TButton;
|
||||
deleteA2Nbtn: TButton;
|
||||
addA2Nbtn: TButton;
|
||||
iconsPage: TTabSheet;
|
||||
iconMasksBox: TMemo;
|
||||
iconsBox: TComboBox;
|
||||
Label5: TLabel;
|
||||
Label6: TLabel;
|
||||
Label7: TLabel;
|
||||
redirBox: TLabeledEdit;
|
||||
inBrowserIfMIMEchk: TCheckBox;
|
||||
traypreviewBox: TMemo;
|
||||
Label10: TLabel;
|
||||
accountLinkBox: TLabeledEdit;
|
||||
groupChk: TCheckBox;
|
||||
groupsBtn: TButton;
|
||||
addaccountBtn: TButton;
|
||||
upBtn: TButton;
|
||||
downBtn: TButton;
|
||||
sortBtn: TButton;
|
||||
notesBox: TMemo;
|
||||
Label8: TLabel;
|
||||
sortBanBtn: TButton;
|
||||
notesWrapChk: TCheckBox;
|
||||
accountsBox: TListView;
|
||||
procedure FormShow(Sender: TObject);
|
||||
procedure FormResize(Sender: TObject);
|
||||
procedure addaccountBtnClick(Sender: TObject);
|
||||
procedure deleteaccountBtnClick(Sender: TObject);
|
||||
procedure accountsBoxEdited(Sender: TObject; Item: TListItem; var S: String);
|
||||
procedure renaccountBtnClick(Sender: TObject);
|
||||
procedure accountAccessBoxDblClick(Sender: TObject);
|
||||
procedure accountAccessBoxContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
|
||||
procedure cancelBtnClick(Sender: TObject);
|
||||
procedure okBtnClick(Sender: TObject);
|
||||
procedure applyBtnClick(Sender: TObject);
|
||||
procedure addBtnClick(Sender: TObject);
|
||||
procedure Button1Click(Sender: TObject);
|
||||
procedure deleteBtnClick(Sender: TObject);
|
||||
procedure pwdBoxEnter(Sender: TObject);
|
||||
procedure pwdBoxExit(Sender: TObject);
|
||||
procedure addMimeBtnClick(Sender: TObject);
|
||||
procedure deleteMimeBtnClick(Sender: TObject);
|
||||
procedure addA2NbtnClick(Sender: TObject);
|
||||
procedure deleteA2NbtnClick(Sender: TObject);
|
||||
procedure iconsBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
|
||||
procedure iconsBoxDropDown(Sender: TObject);
|
||||
procedure iconsBoxChange(Sender: TObject);
|
||||
procedure iconMasksBoxChange(Sender: TObject);
|
||||
procedure traymsgBoxChange(Sender: TObject);
|
||||
procedure FormActivate(Sender: TObject);
|
||||
procedure accountLinkBoxExit(Sender: TObject);
|
||||
procedure groupChkClick(Sender: TObject);
|
||||
procedure groupsBtnClick(Sender: TObject);
|
||||
procedure accountenabledChkClick(Sender: TObject);
|
||||
procedure upBtnClick(Sender: TObject);
|
||||
procedure sortBtnClick(Sender: TObject);
|
||||
procedure ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
|
||||
State: TDragState; var Accept: Boolean);
|
||||
procedure upBtnMouseUp(Sender: TObject; Button: TMouseButton;
|
||||
Shift: TShiftState; X, Y: Integer);
|
||||
procedure sortBanBtnClick(Sender: TObject);
|
||||
procedure notesWrapChkClick(Sender: TObject);
|
||||
procedure FormCreate(Sender: TObject);
|
||||
procedure accountsBoxData(Sender: TObject; Item: TListItem);
|
||||
procedure accountsBoxKeyDown(Sender: TObject; var Key: Word;
|
||||
Shift: TShiftState);
|
||||
procedure accountsBoxClick(Sender: TObject);
|
||||
procedure accountsBoxDragOver(Sender, Source: TObject; X, Y: Integer;
|
||||
State: TDragState; var Accept: Boolean);
|
||||
procedure accountsBoxDragDrop(Sender, Source: TObject; X, Y: Integer);
|
||||
procedure accountsBoxChange(Sender: TObject; Item: TListItem;
|
||||
Change: TItemChange);
|
||||
procedure updateAccessBox();
|
||||
procedure accountsBoxDblClick(Sender: TObject);
|
||||
procedure redirBoxChange(Sender: TObject);
|
||||
procedure accountsBoxKeyPress(Sender: TObject; var Key: Char);
|
||||
procedure accountsBoxEditing(Sender: TObject; Item: TListItem;
|
||||
var AllowEdit: Boolean);
|
||||
public
|
||||
procedure checkRedir();
|
||||
procedure loadAccountProperties();
|
||||
function saveAccountProperties():boolean;
|
||||
procedure deleteAccount(idx:integer=-1);
|
||||
procedure loadValues();
|
||||
function saveValues():boolean; // it may fail on incorrect input
|
||||
function checkValues():string; // returns an error message
|
||||
procedure updateIconMap();
|
||||
procedure updateIconsBox();
|
||||
procedure selectAccount(i:integer; saveBefore:boolean=TRUE);
|
||||
end;
|
||||
|
||||
var
|
||||
optionsFrm: ToptionsFrm;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
uses
|
||||
utilLib, HSlib, strUtils, classesLib, listSelectDlg;
|
||||
|
||||
var
|
||||
lastAccountSelected: integer = -1; // stores the previous selection index
|
||||
tempAccounts: Taccounts; // the GUI part can't store the temp data
|
||||
tempIcons: array of integer;
|
||||
renamingAccount: boolean;
|
||||
|
||||
procedure ToptionsFrm.selectAccount(i:integer; saveBefore:boolean=TRUE);
|
||||
begin
|
||||
if saveBefore then saveAccountProperties();
|
||||
accountsBox.itemIndex:=i;
|
||||
accountsBox.ItemFocused:=accountsBox.Selected;
|
||||
loadAccountProperties();
|
||||
end; // selectAccount
|
||||
|
||||
procedure ToptionsFrm.loadValues();
|
||||
var
|
||||
i:integer;
|
||||
begin
|
||||
// bans
|
||||
noreplybanChk.checked:=noReplyBan;
|
||||
bansBox.Strings.Clear();
|
||||
for i:=0 to length(banList)-1 do
|
||||
bansBox.strings.Add(banList[i].ip+'='+banlist[i].comment);
|
||||
// mime types
|
||||
inBrowserIfMIMEchk.Checked:=inBrowserIfMIME;
|
||||
mimeBox.Strings.Clear();
|
||||
for i:=0 to length(mimeTypes) div 2-1 do
|
||||
mimeBox.strings.add(mimeTypes[i*2]+'='+mimeTypes[i*2+1]);
|
||||
for i:=0 to length(DEFAULT_MIME_TYPES) div 2-1 do
|
||||
if not stringExists(DEFAULT_MIME_TYPES[i*2], mimeTypes) then
|
||||
mimeBox.strings.add(DEFAULT_MIME_TYPES[i*2]+'='+DEFAULT_MIME_TYPES[i*2+1]);
|
||||
// address2name
|
||||
a2nBox.Strings.clear();
|
||||
for i:=0 to length(address2name) div 2-1 do
|
||||
a2nBox.strings.Add(address2name[i*2]+'='+address2name[i*2+1]);
|
||||
// tray message
|
||||
traymsgBox.Text:=replaceStr(trayMsg,#13,CRLF);
|
||||
// accounts
|
||||
tempAccounts:=accounts;
|
||||
setLength(tempAccounts, length(tempAccounts)); // unlink from the source
|
||||
accountsBox.items.count:=length(accounts);
|
||||
lastAccountSelected:=-1;
|
||||
loadAccountProperties();
|
||||
// remember original name for tracking possible later renaming
|
||||
for i:=0 to length(accounts)-1 do
|
||||
with accounts[i] do
|
||||
wasUser:=user;
|
||||
// icons
|
||||
updateIconsBox();
|
||||
i:=length(iconMasks);
|
||||
setLength(tempIcons, i+1);
|
||||
iconMasksBox.Text:='';
|
||||
for i:=0 to i-1 do
|
||||
begin
|
||||
iconMasksBox.lines.Add(iconMasks[i].str);
|
||||
tempIcons[i]:=iconMasks[i].int;
|
||||
end;
|
||||
iconMasksBox.SelStart:=0;
|
||||
end; // loadValues
|
||||
|
||||
procedure ToptionsFrm.notesWrapChkClick(Sender: TObject);
|
||||
begin
|
||||
notesBox.WordWrap:=notesWrapChk.checked;
|
||||
if notesBox.WordWrap then
|
||||
notesBox.ScrollBars:=ssVertical
|
||||
else
|
||||
notesBox.ScrollBars:=ssBoth
|
||||
end;
|
||||
|
||||
function ToptionsFrm.checkValues():string;
|
||||
var
|
||||
i: integer;
|
||||
s: string;
|
||||
begin
|
||||
for i:=bansBox.Strings.count downto 1 do
|
||||
begin
|
||||
bansbox.cells[0,i]:=trim(bansbox.cells[0,i]);
|
||||
s:=bansbox.cells[0,i];
|
||||
if s = '' then continue;
|
||||
if bansBox.strings.indexOfName(s)+1 < i then
|
||||
begin
|
||||
result:=format('Bans: "%s" is duplicated', [s]);
|
||||
exit;
|
||||
end;
|
||||
if not checkAddressSyntax(s) then
|
||||
begin
|
||||
result:=format('Bans: syntax error for "%s"', [s]);
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
for i:=a2nBox.Strings.count downto 1 do
|
||||
begin
|
||||
s:=trim(a2nBox.cells[1,i]);
|
||||
if trim(s+a2nBox.cells[0,i]) = '' then
|
||||
a2nBox.DeleteRow(i)
|
||||
else
|
||||
if (s>'') and not checkAddressSyntax(s) then
|
||||
begin
|
||||
result:=format('Address2name: syntax error for "%s"', [s]);
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
result:='';
|
||||
end; // checkValues
|
||||
|
||||
function ToptionsFrm.saveValues():boolean;
|
||||
var
|
||||
i, n: integer;
|
||||
s: string;
|
||||
begin
|
||||
result:=FALSE;
|
||||
s:=checkValues();
|
||||
if s > '' then
|
||||
begin
|
||||
msgDlg(s, MB_ICONERROR);
|
||||
exit;
|
||||
end;
|
||||
if not saveAccountProperties() then exit;
|
||||
// bans
|
||||
noReplyBan:=noreplybanChk.checked;
|
||||
i:=bansbox.Strings.Count;
|
||||
if bansbox.Cells[0,i] = '' then dec(i);
|
||||
setlength(banlist, i);
|
||||
n:=0;
|
||||
for i:=0 to length(banlist)-1 do
|
||||
begin
|
||||
banlist[n].ip:=trim(bansBox.Cells[0,i+1]); // mod by mars
|
||||
if banlist[n].ip = '' then continue;
|
||||
banlist[n].comment:=bansBox.Cells[1,i+1];
|
||||
inc(n);
|
||||
end;
|
||||
setlength(banlist, n);
|
||||
kickBannedOnes();
|
||||
// mime types
|
||||
inBrowserIfMIME:=inBrowserIfMIMEchk.checked;
|
||||
mimeTypes:=NIL;
|
||||
for i:=1 to mimebox.rowCount-1 do
|
||||
addArray(mimeTypes, [mimeBox.cells[0,i], mimeBox.cells[1,i]]);
|
||||
|
||||
// address2name
|
||||
address2name:=NIL;
|
||||
for i:=1 to a2nBox.RowCount-1 do
|
||||
begin
|
||||
s:=trim(a2nBox.Cells[1,i]);
|
||||
if s > '' then addArray(address2name, [a2nBox.Cells[0,i], s]);
|
||||
end;
|
||||
// tray message
|
||||
trayMsg:=replaceStr(traymsgBox.Text, #10,'');
|
||||
// accounts
|
||||
accounts:=tempAccounts;
|
||||
purgeVFSaccounts();
|
||||
mainfrm.filesBox.repaint();
|
||||
// icons
|
||||
setlength(iconMasks, 0); // mod by mars
|
||||
n:=0;
|
||||
for i:=0 to iconMasksBox.Lines.Count-1 do
|
||||
begin
|
||||
s:=iconMasksBox.Lines[i];
|
||||
if trim(s) = '' then continue;
|
||||
inc(n);
|
||||
setlength(iconMasks, n);
|
||||
iconMasks[n-1].str:=s;
|
||||
iconMasks[n-1].int:=tempIcons[i];
|
||||
end;
|
||||
result:=TRUE;
|
||||
end; // saveValues
|
||||
|
||||
function ipListComp(list: TStringList; index1, index2: integer):integer;
|
||||
|
||||
function extract(s:string; var o:integer):string;
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
i:=posEx('.',s,o);
|
||||
if i = 0 then i:=length(s)+1;
|
||||
result:=substr(s,o,i-1);
|
||||
o:=i+1;
|
||||
end; // extract
|
||||
|
||||
function compare(a,b:string):integer;
|
||||
begin
|
||||
try result:=compare_(strToInt(a), strToInt(b));
|
||||
except
|
||||
result:=compare_(length(a), length(b));
|
||||
if result = 0 then
|
||||
result:=ansiCompareStr(a,b);
|
||||
end;
|
||||
end; // compare
|
||||
|
||||
var
|
||||
o1, o2: integer;
|
||||
s1, s2: string;
|
||||
begin
|
||||
s1:=getTill('=', list[index1]);
|
||||
s2:=getTill('=', list[index2]);
|
||||
o1:=1;
|
||||
o2:=1;
|
||||
repeat
|
||||
result:=compare(extract(s1,o1), extract(s2,o2));
|
||||
until (result <> 0) or (o1 > length(s1)) and (o2 > length(s2));
|
||||
end; // ipListComp
|
||||
|
||||
procedure ToptionsFrm.sortBanBtnClick(Sender: TObject);
|
||||
begin
|
||||
(bansbox.strings as TstringList).customSort(ipListComp);
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.sortBtnClick(Sender: TObject);
|
||||
|
||||
function sortIt(reverse:boolean=FALSE):boolean;
|
||||
var
|
||||
s, i, j, l: integer;
|
||||
begin
|
||||
result:=FALSE;
|
||||
s:=accountsBox.ItemIndex;
|
||||
l:=length(tempAccounts);
|
||||
for i:=0 to l-2 do
|
||||
for j:=i+1 to l-1 do
|
||||
if reverse XOR (compareText(tempAccounts[i].user, tempAccounts[j].user) > 0) then
|
||||
begin
|
||||
swapMem(tempAccounts[i], tempAccounts[j], sizeof(tempAccounts[0]));
|
||||
if i = s then
|
||||
s:=j
|
||||
else if j = s then
|
||||
s:=i;
|
||||
result:=TRUE;
|
||||
end;
|
||||
accountsBox.ItemIndex:=s;
|
||||
end; // sortIt
|
||||
|
||||
begin
|
||||
lastAccountSelected:=-1;
|
||||
if not sortIt(FALSE) then sortIt(TRUE);
|
||||
accountsBox.invalidate();
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.traymsgBoxChange(Sender: TObject);
|
||||
begin traypreviewBox.text:=mainfrm.getTrayTipMsg(traymsgBox.text) end;
|
||||
|
||||
procedure ToptionsFrm.FormShow(Sender: TObject);
|
||||
var
|
||||
i: integer;
|
||||
s: string;
|
||||
begin
|
||||
// if we do this, any hint window will bring focus to the main form
|
||||
//setwindowlong(handle, GWL_HWNDPARENT, 0); // get a taskbar button
|
||||
loadValues();
|
||||
if pageCtrl.activePage <> a2nPage then exit;
|
||||
s:=mainfrm.ipPointedInLog();
|
||||
if s = '' then exit;
|
||||
// select row or insert new one
|
||||
i:=length(address2name)-1;
|
||||
while (i > 0) and not addressmatch(address2name[i], s) do
|
||||
dec(i, 2);
|
||||
if i <= 0 then a2nBox.row:=a2nBox.insertRow('',s,TRUE)
|
||||
else
|
||||
try a2nBox.Row:=i
|
||||
except end; // this should not happen, but in case (it was reported once) just skip selecting
|
||||
|
||||
a2nBox.SetFocus();
|
||||
a2nBox.EditorMode:=TRUE;
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.groupChkClick(Sender: TObject);
|
||||
begin
|
||||
pwdBox.visible:=not groupChk.checked;
|
||||
accountsBox.invalidate();
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.FormActivate(Sender: TObject);
|
||||
begin traymsgBoxChange(NIL) end;
|
||||
|
||||
procedure ToptionsFrm.FormCreate(Sender: TObject);
|
||||
begin
|
||||
notesWrapChk.Checked:=TRUE;
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.FormResize(Sender: TObject);
|
||||
begin bansBox.ColWidths[1]:=bansBox.ClientWidth-bansBox.colWidths[0]-2 end;
|
||||
|
||||
procedure setEnabledRecur(c:Tcontrol; v:boolean);
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
c.enabled:=v;
|
||||
if c is TTreeView then
|
||||
(c as TTreeView).items.clear();
|
||||
if c is TLabeledEdit then
|
||||
(c as TLabeledEdit).text:='';
|
||||
if c is Tmemo then
|
||||
(c as Tmemo).text:='';
|
||||
if c is Tcheckbox then
|
||||
(c as Tcheckbox).checked:=FALSE;
|
||||
|
||||
if c is Twincontrol then
|
||||
with c as Twincontrol do
|
||||
for i:=0 to controlCount-1 do
|
||||
setEnabledRecur(controls[i], v);
|
||||
end; // setEnabledRecur
|
||||
|
||||
procedure ToptionsFrm.updateAccessBox();
|
||||
var
|
||||
n: Ttreenode;
|
||||
f: Tfile;
|
||||
props: TstringDynArray;
|
||||
act: TfileAction;
|
||||
s: string;
|
||||
a, other: Paccount;
|
||||
begin
|
||||
accountAccessBox.items.clear();
|
||||
if lastAccountSelected < 0 then exit;
|
||||
a:=@tempAccounts[lastAccountSelected];
|
||||
n:=rootNode;
|
||||
while n <> NIL do
|
||||
begin
|
||||
f:=Tfile(n.data);
|
||||
n:=n.getNext();
|
||||
if f = NIL then continue;
|
||||
|
||||
props:=NIL;
|
||||
for act:=low(TfileAction) to high(TfileAction) do
|
||||
begin
|
||||
s:=FILEACTION2STR[act];
|
||||
// any_account will suffice, otherwise our username (or a linked one) must be there explicitly, otherwise the resource is not protected or we have no access and thus must not be listed
|
||||
if not stringExists(USER_ANY_ACCOUNT, f.accounts[act]) then
|
||||
begin
|
||||
other:=findEnabledLinkedAccount(a, f.accounts[act]);
|
||||
if other = NIL then continue;
|
||||
if other <> a then
|
||||
s:=s+' via '+other.user;
|
||||
end;
|
||||
addString(s, props);
|
||||
end;
|
||||
if props = NIL then continue;
|
||||
|
||||
with accountAccessBox.items.addObject(NIL, f.name+' ['+join(', ',props)+']', f.node) do
|
||||
begin
|
||||
imageIndex:=f.node.imageIndex;
|
||||
selectedIndex:=imageIndex;
|
||||
end;
|
||||
end;
|
||||
end; // updateAccessBox
|
||||
|
||||
procedure ToptionsFrm.checkRedir();
|
||||
begin // mod by mars
|
||||
redirBox.color:=blend(clWindow, clRed,
|
||||
ifThen((redirBox.text >'') and not fileExistsByURL(redirBox.text), 0.5, 0) );
|
||||
end; // checkRedir
|
||||
|
||||
procedure ToptionsFrm.loadAccountProperties();
|
||||
var
|
||||
a: Paccount;
|
||||
b, bakWrap: boolean;
|
||||
i: integer;
|
||||
begin
|
||||
lastAccountSelected:=accountsBox.ItemIndex;
|
||||
b:=lastAccountSelected >= 0;
|
||||
bakWrap:=notesWrapChk.checked;
|
||||
setEnabledRecur(accountpropGrp, b);
|
||||
notesWrapChk.checked:=bakWrap;
|
||||
renAccountBtn.enabled:=b;
|
||||
deleteAccountBtn.enabled:=b;
|
||||
upBtn.Enabled:=b;
|
||||
downBtn.enabled:=b;
|
||||
|
||||
if not accountpropGrp.Enabled then exit;
|
||||
a:=@tempAccounts[lastAccountSelected];
|
||||
accountEnabledChk.checked:=a.enabled;
|
||||
pwdBox.Text:=a.pwd;
|
||||
groupChk.Checked:=a.group;
|
||||
accountLinkBox.text:=join(';',a.link);
|
||||
ignoreLimitsChk.Checked:=a.noLimits;
|
||||
redirBox.Text:=a.redir;
|
||||
notesBox.text:=a.notes;
|
||||
|
||||
groupsBtn.enabled:=FALSE;;
|
||||
for i:=0 to length(tempAccounts)-1 do
|
||||
if tempAccounts[i].group and (i <> accountsBox.itemIndex) then
|
||||
groupsBtn.enabled:=TRUE;
|
||||
|
||||
updateAccessBox();
|
||||
accountsBox.invalidate();
|
||||
end; // loadAccountProperties
|
||||
|
||||
function ToptionsFrm.saveAccountProperties():boolean;
|
||||
const
|
||||
MSG_CHARS = 'The characters below are not allowed'
|
||||
+#13'/\:?*"<>|;&&@';
|
||||
MSG_PWD = 'Invalid password.'#13+MSG_CHARS;
|
||||
var
|
||||
a: Paccount;
|
||||
begin
|
||||
result:=TRUE;
|
||||
if lastAccountSelected < 0 then exit;
|
||||
result:=FALSE;
|
||||
if not validUsername(pwdbox.Text, TRUE) then
|
||||
begin
|
||||
msgDlg(MSG_PWD, MB_ICONERROR);
|
||||
exit;
|
||||
end;
|
||||
|
||||
a:=@tempAccounts[lastAccountSelected];
|
||||
a.enabled:=accountEnabledChk.checked;
|
||||
a.pwd:=pwdBox.Text;
|
||||
a.noLimits:=ignoreLimitsChk.checked;
|
||||
a.redir:=redirBox.Text;
|
||||
a.notes:=notesBox.text;
|
||||
a.link:=split(';', trim(accountLinkBox.text));
|
||||
a.group:=groupChk.Checked;
|
||||
uniqueStrings(a.link);
|
||||
result:=TRUE;
|
||||
accountsBox.invalidate();
|
||||
end; // saveAccountProperties
|
||||
|
||||
function findUser(user:string):integer;
|
||||
begin
|
||||
result:=length(tempAccounts)-1;
|
||||
while (result >= 0) and not sameText(tempAccounts[result].user, user) do
|
||||
dec(result);
|
||||
end; // findUser
|
||||
|
||||
function userExists(user:string):boolean; overload;
|
||||
begin result:=findUser(user) >= 0 end;
|
||||
|
||||
function userExists(user:string; excpt:integer):boolean; overload;
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
i:=findUser(user);
|
||||
result:=(i >= 0) and (i <> excpt);
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.addaccountBtnClick(Sender: TObject);
|
||||
var
|
||||
i: integer;
|
||||
a: Taccount;
|
||||
begin
|
||||
a.user:=getUniqueName('new user', userExists);
|
||||
a.pwd:='';
|
||||
a.enabled:=TRUE;
|
||||
a.noLimits:=FALSE;
|
||||
a.redir:='';
|
||||
|
||||
i:=length(tempAccounts);
|
||||
setLength(tempAccounts, i+1);
|
||||
tempAccounts[i]:=a;
|
||||
accountsBox.items.add();
|
||||
selectAccount(i);
|
||||
|
||||
renaccountBtnClick(sender);
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.deleteAccount(idx:integer=-1);
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
if idx < 0 then
|
||||
begin
|
||||
idx:=accountsBox.itemIndex;
|
||||
if idx < 0 then exit;
|
||||
if msgDlg('Delete?', MB_ICONQUESTION+MB_YESNO) = IDNO then
|
||||
exit;
|
||||
end;
|
||||
// shift
|
||||
for i:=idx+1 to length(tempAccounts)-1 do
|
||||
tempAccounts[i-1]:=tempAccounts[i];
|
||||
// shorten
|
||||
with accountsBox.items do count:=count-1; // dunno why, but invoking delete* methods doesn't work
|
||||
setlength(tempAccounts, length(tempAccounts)-1);
|
||||
selectAccount(min(idx, length(tempAccounts)-1), FALSE);
|
||||
end; // deleteAccount
|
||||
|
||||
procedure ToptionsFrm.deleteaccountBtnClick(Sender: TObject);
|
||||
begin deleteAccount() end;
|
||||
|
||||
procedure swapItems(i, j:integer);
|
||||
var
|
||||
s: integer;
|
||||
begin
|
||||
s:=length(tempAccounts)-1;
|
||||
if not inRange(i, 0,s) or not inRange(j, 0,s) then exit;
|
||||
s:=optionsFrm.accountsBox.itemIndex;
|
||||
lastAccountSelected:=-1; // avoid data saving from fields while moving
|
||||
swapMem(tempAccounts[i], tempAccounts[j], sizeof(tempAccounts[i]));
|
||||
if i = s then
|
||||
s:=j
|
||||
else if j = s then
|
||||
s:=i;
|
||||
with optionsFrm.accountsBox do
|
||||
begin
|
||||
itemIndex:=s;
|
||||
selected.focused:=TRUE;
|
||||
invalidate();
|
||||
end;
|
||||
end; // swapItems
|
||||
|
||||
procedure ToptionsFrm.accountsBoxChange(Sender: TObject; Item: TListItem; Change: TItemChange);
|
||||
begin
|
||||
if (change = ctState) and assigned(item) and item.selected then
|
||||
selectAccount(item.index);
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.accountsBoxClick(Sender: TObject);
|
||||
begin
|
||||
selectAccount(accountsBox.itemIndex);
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.accountsBoxData(Sender: TObject; Item: TListItem);
|
||||
var
|
||||
a: Paccount;
|
||||
begin
|
||||
if (item = NIL) or not inRange(item.index, 0,length(tempAccounts)-1) then
|
||||
exit;
|
||||
a:=@tempAccounts[item.index];
|
||||
item.caption:=a.user;
|
||||
item.imageIndex:=if_(item.index = lastAccountSelected,
|
||||
accountIcon(accountenabledChk.checked, groupChk.checked),
|
||||
accountIcon(a)
|
||||
);
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.accountsBoxDblClick(Sender: TObject);
|
||||
begin renaccountBtnClick(renaccountBtn) end;
|
||||
|
||||
procedure ToptionsFrm.accountsBoxDragDrop(Sender, Source: TObject; X,
|
||||
Y: Integer);
|
||||
begin
|
||||
swapItems(accountsBox.getItemAt(x,y).index, accountsBox.itemIndex);
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.accountsBoxDragOver(Sender, Source: TObject; X,
|
||||
Y: Integer; State: TDragState; var Accept: Boolean);
|
||||
begin
|
||||
accept:=(sender = source) and assigned(accountsBox.getItemAt(x,y));
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.accountsBoxEdited(Sender: TObject; Item: TListItem; var S: String);
|
||||
var
|
||||
old, err: string;
|
||||
i, idx: integer;
|
||||
begin
|
||||
renamingAccount:=FALSE;
|
||||
try idx:=item.index // workaround to wine's bug http://www.rejetto.com/forum/index.php/topic,9563.msg1053890.html#msg1053890
|
||||
except idx:=lastAccountSelected end;
|
||||
old:=tempAccounts[idx].user;
|
||||
if not validUsername(s) then
|
||||
err:='Invalid username'
|
||||
else if userExists(s, accountsBox.itemIndex) then
|
||||
err:='Username already used'
|
||||
else
|
||||
err:='';
|
||||
|
||||
if err > '' then
|
||||
begin
|
||||
msgDlg(err, MB_ICONERROR);
|
||||
s:=old;
|
||||
exit;
|
||||
end;
|
||||
// update linkings
|
||||
for i:=0 to length(tempAccounts)-1 do
|
||||
replaceString(tempAccounts[i].link, old, s);
|
||||
tempAccounts[idx].user:=s;
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.accountsBoxEditing(Sender: TObject; Item: TListItem;
|
||||
var AllowEdit: Boolean);
|
||||
begin
|
||||
renamingAccount:=TRUE;
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.accountsBoxKeyDown(Sender: TObject; var Key: Word;
|
||||
Shift: TShiftState);
|
||||
begin
|
||||
if shift = [] then
|
||||
case key of
|
||||
VK_F2: renaccountBtn.click();
|
||||
VK_INSERT: addaccountBtn.click(); // mod by mars
|
||||
VK_DELETE: deleteAccount();
|
||||
end;
|
||||
{mod by mars}
|
||||
if shift = [ssAlt] then
|
||||
case key of
|
||||
VK_UP: upBtn.click();
|
||||
VK_DOWN: downBtn.click();
|
||||
end;
|
||||
{/mod}
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.accountsBoxKeyPress(Sender: TObject; var Key: Char);
|
||||
var
|
||||
s, i, ir, n: integer;
|
||||
begin
|
||||
if renamingAccount then
|
||||
exit;
|
||||
key:=upcase(key);
|
||||
if key in ['0'..'9','A'..'Z'] then
|
||||
begin
|
||||
s:=accountsBox.ItemIndex;
|
||||
n:=length(tempAccounts);
|
||||
for i:=1 to n-1 do
|
||||
begin
|
||||
ir:=(s+i) mod n;
|
||||
if key = upcase(tempAccounts[ir].user[1]) then
|
||||
begin
|
||||
selectAccount(ir);
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.redirBoxChange(Sender: TObject);
|
||||
begin checkRedir() end;
|
||||
|
||||
procedure ToptionsFrm.renaccountBtnClick(Sender: TObject);
|
||||
begin
|
||||
if accountsBox.selected = NIL then exit;
|
||||
accountsBox.Selected.editCaption();
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.accountLinkBoxExit(Sender: TObject);
|
||||
const
|
||||
MSG_MISSING_USERS = 'Cannot find these linked usernames: %s'
|
||||
+#13'This is abnormal, but you may add them later.';
|
||||
var
|
||||
users, missing: TStringDynArray;
|
||||
i: integer;
|
||||
begin
|
||||
users:=split(';', trim(accountLinkBox.text));
|
||||
// check for non-existent linked account
|
||||
missing:=NIL;
|
||||
for i:=0 to length(users)-1 do
|
||||
if not userExists(users[i]) then
|
||||
addString(users[i], missing);
|
||||
if assigned(missing) then
|
||||
msgDlg(format(MSG_MISSING_USERS, [join(', ', missing)]), MB_ICONWARNING);
|
||||
// permissions may have been changed
|
||||
updateAccessBox();
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.accountAccessBoxDblClick(Sender: TObject);
|
||||
begin
|
||||
with sender as Ttreeview do
|
||||
begin
|
||||
if selected = NIL then exit;
|
||||
mainfrm.filesBox.selected:=selected.Data;
|
||||
mainfrm.setFocus();
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.accountenabledChkClick(Sender: TObject);
|
||||
begin accountsBox.invalidate() end;
|
||||
|
||||
procedure ToptionsFrm.accountAccessBoxContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
|
||||
begin
|
||||
with sender as Ttreeview do
|
||||
if selected = NIL then handled:=TRUE
|
||||
else mainfrm.filesBox.selected:=selected.data;
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.cancelBtnClick(Sender: TObject);
|
||||
begin close() end;
|
||||
|
||||
procedure ToptionsFrm.applyBtnClick(Sender: TObject);
|
||||
begin saveValues() end;
|
||||
|
||||
procedure ToptionsFrm.okBtnClick(Sender: TObject);
|
||||
begin if saveValues() then close() end;
|
||||
|
||||
procedure ToptionsFrm.Button1Click(Sender: TObject);
|
||||
begin msgDlg(getRes('invertBan')) end;
|
||||
|
||||
procedure ToptionsFrm.groupsBtnClick(Sender: TObject);
|
||||
var
|
||||
i: integer;
|
||||
there: TStringDynArray;
|
||||
groups: TstringList;
|
||||
s: string;
|
||||
begin
|
||||
there:=split(';', accountLinkBox.Text);
|
||||
groups:=TstringList.create;
|
||||
try
|
||||
for i:=0 to length(tempAccounts)-1 do
|
||||
if tempAccounts[i].group and (i <> accountsBox.itemIndex) then
|
||||
begin
|
||||
s:=tempAccounts[i].user;
|
||||
groups.AddObject(s, if_(stringExists(s, there), PTR1, NIL));
|
||||
end;
|
||||
if not listSelect('Select groups', groups) then exit;
|
||||
s:='';
|
||||
for i:=0 to groups.Count-1 do
|
||||
if groups.Objects[i] <> NIL then
|
||||
s:=s+groups[i]+';';
|
||||
accountLinkBox.Text:=getTill(-1, s);
|
||||
finally groups.free end;
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.pwdBoxEnter(Sender: TObject);
|
||||
begin if pwdBox.Text > '' then pwdBox.passwordChar:=#0 end;
|
||||
|
||||
procedure ToptionsFrm.pwdBoxExit(Sender: TObject);
|
||||
begin pwdBox.passwordChar:='*' end;
|
||||
|
||||
procedure ToptionsFrm.addBtnClick(Sender: TObject);
|
||||
begin bansBox.InsertRow('','',TRUE) end;
|
||||
|
||||
procedure ToptionsFrm.deleteBtnClick(Sender: TObject);
|
||||
begin
|
||||
if bansbox.strings.count > 0 then
|
||||
bansBox.Strings.Delete(bansBox.Row-1)
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.addMimeBtnClick(Sender: TObject);
|
||||
begin mimeBox.InsertRow('','',TRUE) end;
|
||||
|
||||
procedure ToptionsFrm.deleteMimeBtnClick(Sender: TObject);
|
||||
begin
|
||||
if mimeBox.strings.count > 0 then
|
||||
mimeBox.Strings.Delete(mimeBox.Row-1)
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.addA2NbtnClick(Sender: TObject);
|
||||
begin
|
||||
a2nBox.insertRow('','',TRUE);
|
||||
a2nBox.setFocus();
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.deleteA2NbtnClick(Sender: TObject);
|
||||
begin
|
||||
if a2nBox.strings.count > 0 then
|
||||
a2nBox.Strings.Delete(a2nBox.Row-1)
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.iconsBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
|
||||
var
|
||||
cnv: TCanvas;
|
||||
bmp: Tbitmap;
|
||||
begin
|
||||
cnv:=iconsBox.Canvas;
|
||||
bmp:=Tbitmap.create;
|
||||
try
|
||||
mainfrm.images.GetBitmap(index, bmp);
|
||||
cnv.FillRect(rect);
|
||||
cnv.Draw(rect.Left, rect.Top, bmp);
|
||||
cnv.TextOut(rect.Left+mainfrm.images.Width+2, rect.Top, idx_label(index));
|
||||
finally bmp.free end;
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.updateIconsBox();
|
||||
// alloc enough slots. the text is not used, labels are built by the paint event
|
||||
begin iconsBox.Items.Text:=dupeString(CRLF, mainfrm.images.count) end;
|
||||
|
||||
procedure ToptionsFrm.iconsBoxDropDown(Sender: TObject);
|
||||
begin updateIconsBox() end;
|
||||
|
||||
procedure ToptionsFrm.ListView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
|
||||
begin
|
||||
accept:=source = sender;
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.upBtnClick(Sender: TObject);
|
||||
var
|
||||
i, dir: integer;
|
||||
begin
|
||||
dir:=if_(sender = upBtn, -1, +1);
|
||||
i:=accountsBox.itemIndex;
|
||||
if not inRange(i+dir, 0,length(tempAccounts)-1) then exit;
|
||||
swapItems(i, i+dir);
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.upBtnMouseUp(Sender: TObject; Button: TMouseButton;
|
||||
Shift: TShiftState; X, Y: Integer);
|
||||
begin
|
||||
accountsBox.setFocus()
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.updateIconMap();
|
||||
begin
|
||||
if not iconsBox.DroppedDown then
|
||||
iconsBox.ItemIndex:=tempIcons[iconMasksBox.CaretPos.Y];
|
||||
end;
|
||||
|
||||
procedure ToptionsFrm.iconsBoxChange(Sender: TObject);
|
||||
begin tempIcons[iconMasksBox.CaretPos.Y]:=iconsBox.ItemIndex end;
|
||||
|
||||
procedure ToptionsFrm.iconMasksBoxChange(Sender: TObject);
|
||||
begin setLength(tempIcons, iconMasksBox.Lines.count+1) end;
|
||||
|
||||
end.
|
||||
247
parserLib.pas
Normal file
247
parserLib.pas
Normal file
@ -0,0 +1,247 @@
|
||||
unit parserLib;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
strutils, sysutils, classes, types, utilLib, windows;
|
||||
|
||||
type
|
||||
TmacroCB = function(fullMacro:string; pars:Tstrings; cbData:pointer):string;
|
||||
EtplError = class(Exception)
|
||||
pos, row, col: integer;
|
||||
code: string;
|
||||
constructor Create(const msg, code:string; row,col:integer);
|
||||
end;
|
||||
const
|
||||
MARKER_OPEN = '{.';
|
||||
MARKER_CLOSE = '.}';
|
||||
MARKER_SEP = '|';
|
||||
MARKER_QUOTE = '{:';
|
||||
MARKER_UNQUOTE = ':}';
|
||||
MARKERS: array [0..4] of string = ( MARKER_OPEN, MARKER_CLOSE, MARKER_SEP, MARKER_QUOTE, MARKER_UNQUOTE );
|
||||
|
||||
function anyMacroMarkerIn(s:string):boolean;
|
||||
function findMacroMarker(s:string; ofs:integer=1):integer;
|
||||
procedure applyMacrosAndSymbols(var txt:string; cb:TmacroCB; cbData:pointer; removeQuotings:boolean=TRUE);
|
||||
|
||||
implementation
|
||||
|
||||
const
|
||||
MAX_RECUR_LEVEL = 50;
|
||||
type
|
||||
TparserIdsStack = array [1..MAX_RECUR_LEVEL] of string;
|
||||
|
||||
constructor EtplError.create(const msg, code:string; row, col:integer);
|
||||
begin
|
||||
inherited create(msg);
|
||||
self.row:=row;
|
||||
self.col:=col;
|
||||
self.code:=code;
|
||||
end;
|
||||
|
||||
procedure applyMacrosAndSymbols2(var txt:string; cb:TmacroCB; cbData:pointer; var idsStack:TparserIdsStack; recurLevel:integer=0);
|
||||
const
|
||||
// we don't track SEPs, they are handled just before the callback
|
||||
QUOTE_ID = 0; // QUOTE must come before OPEN because it is a substring
|
||||
UNQUOTE_ID = 1;
|
||||
OPEN_ID = 2;
|
||||
CLOSE_ID = 3;
|
||||
MAX_MARKER_ID = 3;
|
||||
|
||||
function alreadyRecurredOn(s:string):boolean;
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
result:=TRUE;
|
||||
for i:=recurLevel downto 1 do
|
||||
if sameText(s, idsStack[i]) then exit;
|
||||
result:=FALSE;
|
||||
end; // alreadyRecurredOn
|
||||
|
||||
procedure handleSymbols();
|
||||
var
|
||||
b, e, l : integer;
|
||||
s, newS: string;
|
||||
begin
|
||||
e:=0;
|
||||
l:=length(txt);
|
||||
while e < l do
|
||||
begin
|
||||
// search for next symbol
|
||||
b:=posEx('%',txt,e+1);
|
||||
if b = 0 then break;
|
||||
e:=b+1;
|
||||
if txt[e] = '%' then
|
||||
begin // we don't accept %% as a symbol. so, restart parsing from the second %
|
||||
e:=b;
|
||||
continue;
|
||||
end;
|
||||
if not charInSet(txt[e], ['_','a'..'z','A'..'Z']) then continue; // first valid character
|
||||
while (e < l) and charInSet(txt[e], ['0'..'9','a'..'z','A'..'Z','-','_']) do
|
||||
inc(e);
|
||||
if txt[e] <> '%' then continue;
|
||||
// found!
|
||||
s:=substr(txt,b,e);
|
||||
if alreadyRecurredOn(s) then continue; // the user probably didn't meant to create an infinite loop
|
||||
|
||||
newS:=cb(s, NIL, cbData);
|
||||
if s = newS then continue;
|
||||
|
||||
idsStack[recurLevel]:=s; // keep track of what we recur on
|
||||
// apply translation, and eventually recur
|
||||
try applyMacrosAndSymbols2(newS, cb, cbData, idsStack, recurLevel);
|
||||
except end;
|
||||
idsStack[recurLevel]:='';
|
||||
inc(e, replace(txt, newS, b, e));
|
||||
l:=length(txt);
|
||||
end;
|
||||
end; // handleSymbols
|
||||
|
||||
procedure handleMacros();
|
||||
var
|
||||
pars: Tstrings;
|
||||
|
||||
function expand(from,to_:integer):integer;
|
||||
var
|
||||
s, fullMacro: string;
|
||||
i, o, q, u: integer;
|
||||
begin
|
||||
result:=0;
|
||||
fullMacro:=substr(txt, from+length(MARKER_OPEN), to_-length(MARKER_CLOSE));
|
||||
if alreadyRecurredOn(fullMacro) then exit; // the user probably didn't meant to create an infinite loop
|
||||
|
||||
// let's find the SEPs to build 'pars'
|
||||
pars.clear();
|
||||
i:=1; // char pointer from where we shall copy the macro parameter
|
||||
o:=0;
|
||||
q:=posEx(MARKER_QUOTE, fullMacro); // q points to _QUOTE
|
||||
repeat
|
||||
o:=posEx(MARKER_SEP, fullmacro, o+1);
|
||||
if o = 0 then break;
|
||||
if (q > 0) and (q < o) then // this SEP is possibly quoted
|
||||
begin
|
||||
// update 'q' and 'u'
|
||||
repeat
|
||||
u:=posEx(MARKER_UNQUOTE, fullMacro, q);
|
||||
if u = 0 then exit; // macro quoting not properly closed
|
||||
q:=posEx(MARKER_QUOTE, fullMacro, q+1); // update q for next cycle
|
||||
// if we find other _QUOTEs before _UNQUOTE, then they are stacked, and we must go through the same number of both markers
|
||||
while (q > 0) and (q < u) do
|
||||
begin
|
||||
u:=posEx(MARKER_UNQUOTE, fullMacro, u+1);
|
||||
if u = 0 then exit; // macro quoting not properly closed
|
||||
q:=posEx(MARKER_QUOTE, fullMacro, q+1);
|
||||
end;
|
||||
until (q = 0) or (o < q);
|
||||
// eventually skip this chunk of string
|
||||
if o < u then
|
||||
begin // yes, this SEP is quoted
|
||||
o:=u;
|
||||
continue;
|
||||
end;
|
||||
end;
|
||||
// ok, that's a valid SEP, so we collect this as a parameter
|
||||
pars.add(substr(fullMacro, i, o-1));
|
||||
i:=o+length(MARKER_SEP);
|
||||
until false;
|
||||
pars.add(substr(fullMacro, i, length(fullMacro))); // last piece
|
||||
// ok, 'pars' has now been built
|
||||
|
||||
// do the call, recur, and replace with the result
|
||||
s:=cb(fullMacro, pars, cbData);
|
||||
idsStack[recurLevel]:=fullmacro; // keep track of what we recur on
|
||||
try
|
||||
try applyMacrosAndSymbols2(s, cb, cbData, idsStack, recurLevel) except end;
|
||||
finally idsStack[recurLevel]:='' end;
|
||||
result:=replace(txt, s, from, to_);
|
||||
end; // expand
|
||||
|
||||
const
|
||||
ID2TAG: array [0..MAX_MARKER_ID] of string = (MARKER_QUOTE, MARKER_UNQUOTE, MARKER_OPEN, MARKER_CLOSE);
|
||||
type
|
||||
TstackItem = record
|
||||
pos: integer;
|
||||
row, col: word;
|
||||
quote: boolean;
|
||||
end;
|
||||
var
|
||||
i, lastNL, row, m, t: integer;
|
||||
stack: array of TstackItem;
|
||||
Nstack: integer;
|
||||
begin
|
||||
setLength(stack, length(txt) div length(MARKER_OPEN)); // it will never need more than this
|
||||
Nstack:=0;
|
||||
pars:=TstringList.create;
|
||||
try
|
||||
i:=1;
|
||||
row:=1;
|
||||
lastNL:=0;
|
||||
while i <= length(txt) do
|
||||
begin
|
||||
if txt[i] = #10 then
|
||||
begin
|
||||
inc(row);
|
||||
lastNL:=i;
|
||||
end;
|
||||
for m:=0 to MAX_MARKER_ID do
|
||||
begin
|
||||
if not strAt(txt, ID2TAG[m], i) then continue;
|
||||
case m of
|
||||
QUOTE_ID,
|
||||
OPEN_ID:
|
||||
begin
|
||||
if (m = OPEN_ID) and (Nstack > 0) and stack[Nstack-1].quote then continue; // don't consider quoted OPEN markers
|
||||
stack[Nstack].pos:=i;
|
||||
stack[Nstack].quote:= m=QUOTE_ID;
|
||||
stack[Nstack].row:=row;
|
||||
stack[Nstack].col:=i-lastNL;
|
||||
inc(Nstack);
|
||||
end;
|
||||
CLOSE_ID:
|
||||
begin
|
||||
if Nstack = 0 then
|
||||
raise EtplError.create('unmatched marker', copy(txt,i,30), row, i-lastNL);
|
||||
if (Nstack > 0) and stack[Nstack-1].quote then continue; // don't consider quoted CLOSE markers
|
||||
t:=length(MARKER_CLOSE);
|
||||
inc(i, t-1+expand(stack[Nstack-1].pos, i+t-1));
|
||||
dec(Nstack);
|
||||
end;
|
||||
UNQUOTE_ID:
|
||||
begin
|
||||
if (Nstack = 0) or not stack[Nstack-1].quote then continue;
|
||||
dec(Nstack);
|
||||
end;
|
||||
end;
|
||||
end;//for
|
||||
inc(i);
|
||||
end;
|
||||
finally pars.free end;
|
||||
if Nstack > 0 then
|
||||
with stack[Nstack-1] do
|
||||
raise EtplError.create('unmatched marker', copy(txt,pos,30), row, col)
|
||||
end; // handleMacros
|
||||
|
||||
begin
|
||||
if recurLevel > MAX_RECUR_LEVEL then exit;
|
||||
inc(recurLevel);
|
||||
handleSymbols();
|
||||
handleMacros();
|
||||
end; //applyMacrosAndSymbols2
|
||||
|
||||
procedure applyMacrosAndSymbols(var txt:string; cb:TmacroCB; cbData:pointer; removeQuotings:boolean=TRUE);
|
||||
var
|
||||
idsStack: TparserIdsStack;
|
||||
begin
|
||||
enforceNUL(txt);
|
||||
applyMacrosAndSymbols2(txt,cb,cbData,idsStack);
|
||||
if removeQuotings then
|
||||
txt:=xtpl(txt, [MARKER_QUOTE, '', MARKER_UNQUOTE, ''])
|
||||
end;
|
||||
|
||||
function findMacroMarker(s:string; ofs:integer=1):integer;
|
||||
begin result:=reMatch(s, '\{[.:]|[.:]\}|\|', 'm!', ofs) end;
|
||||
|
||||
function anyMacroMarkerIn(s:string):boolean;
|
||||
begin result:=findMacroMarker(s) > 0 end;
|
||||
|
||||
end.
|
||||
203
progFrmLib.pas
Normal file
203
progFrmLib.pas
Normal file
@ -0,0 +1,203 @@
|
||||
{
|
||||
Copyright (C) 2002-2008 Massimo Melina (www.rejetto.com)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
}
|
||||
unit progFrmLib;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
ComCtrls, Forms, controls, ExtCtrls, buttons, graphics;
|
||||
|
||||
type
|
||||
TprogressForm = class
|
||||
private
|
||||
prog: TProgressBar;
|
||||
frm: Tform;
|
||||
msgPnl: Tpanel;
|
||||
cancelBtn: TbitBtn;
|
||||
btnPnl: Tpanel;
|
||||
stack: array of record ofs,length:real end;
|
||||
partialLength: real;
|
||||
canceled: boolean;
|
||||
function getPos():real;
|
||||
procedure setPos(x:real);
|
||||
function getGlobalPos():real;
|
||||
procedure setGlobalPos(x:real);
|
||||
function getCaption():string;
|
||||
procedure setCaption(x:string);
|
||||
function getVisible():boolean;
|
||||
procedure onCancel(Sender: TObject);
|
||||
procedure onResize(Sender: TObject);
|
||||
public
|
||||
preventBackward: boolean;
|
||||
constructor create;
|
||||
procedure show(caption_:string=''; cancel:boolean=FALSE);
|
||||
procedure hide();
|
||||
property progress:real read getPos write setPos;
|
||||
property globalPosition:real read getGlobalPos write setGlobalPos;
|
||||
property caption:string read getCaption write setCaption;
|
||||
property visible:boolean read getVisible;
|
||||
property cancelRequested:boolean read canceled;
|
||||
procedure push(sublength:real);
|
||||
procedure pop();
|
||||
procedure showCancel();
|
||||
procedure hideCancel();
|
||||
procedure reset();
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
function max(a,b:integer):integer;
|
||||
begin if a > b then result:=a else result:=b end;
|
||||
|
||||
constructor TprogressForm.create;
|
||||
begin
|
||||
frm:=Tform.create(NIL);
|
||||
frm.Position:=poScreenCenter;
|
||||
frm.Width:=200;
|
||||
frm.BorderStyle:=bsNone;
|
||||
frm.BorderWidth:=15;
|
||||
frm.Height:=25+frm.BorderWidth*2;
|
||||
frm.OnResize:=onResize;
|
||||
//frm.FormStyle:=fsStayOnTop;
|
||||
|
||||
msgPnl:=Tpanel.create(frm);
|
||||
msgPnl.Parent:=frm;
|
||||
msgPnl.align:=alTop;
|
||||
msgPnl.height:=20;
|
||||
msgPnl.BevelOuter:=bvLowered;
|
||||
|
||||
prog:=TProgressBar.Create(frm);
|
||||
prog.Parent:=frm;
|
||||
prog.BorderWidth:=3;
|
||||
prog.Min:=0;
|
||||
prog.max:=100; // resolution
|
||||
prog.Align:=alClient;
|
||||
prog.smooth:=TRUE;
|
||||
|
||||
btnPnl:=Tpanel.create(frm);
|
||||
btnPnl.parent:=frm;
|
||||
btnPnl.Align:=alBottom;
|
||||
btnPnl.BevelOuter:=bvLowered;
|
||||
|
||||
cancelBtn:=TbitBtn.create(frm);
|
||||
cancelBtn.parent:=btnPnl;
|
||||
cancelBtn.Kind:=bkCancel;
|
||||
cancelBtn.top:=10;
|
||||
cancelBtn.OnClick:=onCancel;
|
||||
|
||||
btnPnl.Height:=cancelBtn.Height+cancelBtn.top*2;
|
||||
btnPnl.Hide();
|
||||
|
||||
partialLength:=1;
|
||||
push(1); // init stack
|
||||
frm.Height:=frm.Height+msgPnl.Height;
|
||||
end; // constructor
|
||||
|
||||
function TprogressForm.getVisible():boolean;
|
||||
begin result:=frm.Visible end;
|
||||
|
||||
procedure TprogressForm.showCancel();
|
||||
begin
|
||||
if btnPnl.visible then exit;
|
||||
frm.Height:=frm.Height+btnPnl.Height;
|
||||
btnPnl.show();
|
||||
end; // showCancel
|
||||
|
||||
procedure TprogressForm.hideCancel();
|
||||
begin
|
||||
if not btnPnl.visible then exit;
|
||||
frm.Height:=frm.Height-btnPnl.Height;
|
||||
btnPnl.hide();
|
||||
end; // hideCancel
|
||||
|
||||
procedure TprogressForm.show(caption_: string; cancel:boolean);
|
||||
begin
|
||||
canceled:=FALSE;
|
||||
if not frm.visible then reset();
|
||||
if caption_ > '' then caption:=caption_;
|
||||
if cancel then showCancel();
|
||||
frm.Show();
|
||||
end; // show
|
||||
|
||||
procedure TprogressForm.hide();
|
||||
begin
|
||||
frm.hide();
|
||||
hideCancel();
|
||||
end;
|
||||
|
||||
function TprogressForm.getCaption():string;
|
||||
begin result:=msgPnl.caption end;
|
||||
|
||||
procedure TprogressForm.setCaption(x:string);
|
||||
begin
|
||||
msgPnl.caption:=x;
|
||||
frm.Width:=max(200,
|
||||
frm.Canvas.TextWidth(x)+(msgPnl.BorderWidth+frm.BorderWidth)*2+20 );
|
||||
end;
|
||||
|
||||
procedure TprogressForm.setGlobalPos(x:real);
|
||||
begin
|
||||
x:=x*prog.max;
|
||||
if preventBackward and (prog.position > x) then x:=prog.position;
|
||||
prog.position:=round(x);
|
||||
end; // setGlobalPos
|
||||
|
||||
function TprogressForm.getGlobalPos():real;
|
||||
begin result:=prog.position/prog.max end;
|
||||
|
||||
procedure TprogressForm.setPos(x:real);
|
||||
begin setGlobalPos(stack[length(stack)-1].ofs + x*partialLength ) end;
|
||||
|
||||
function TprogressForm.getPos():real;
|
||||
begin result:=getGlobalPos()/partialLength + stack[length(stack)-1].ofs end;
|
||||
|
||||
procedure TprogressForm.push(sublength:real);
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
assert(sublength <= 1,'TprogressForm.push(X): X>1');
|
||||
i:=length(stack);
|
||||
setLength(stack, i+1);
|
||||
stack[i].ofs:=globalPosition;
|
||||
stack[i].length:=partialLength;
|
||||
partialLength:=partialLength*sublength;
|
||||
end; // push
|
||||
|
||||
procedure TprogressForm.pop();
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
assert(length(stack) > 1, 'TprogressForm.pop(): empty stack');
|
||||
progress:=1;
|
||||
i:=length(stack)-1;
|
||||
partialLength:=stack[i].length;
|
||||
setlength(stack, i);
|
||||
end; // pop
|
||||
|
||||
procedure TprogressForm.onCancel(Sender: TObject);
|
||||
begin canceled:=TRUE end;
|
||||
|
||||
procedure TprogressForm.onResize(Sender: TObject);
|
||||
begin cancelBtn.left:=(frm.width-cancelBtn.width) div 2-frm.borderWidth end;
|
||||
|
||||
procedure TprogressForm.reset();
|
||||
begin prog.position:=0 end;
|
||||
|
||||
end.
|
||||
73
purgeDlg.dfm
Normal file
73
purgeDlg.dfm
Normal file
@ -0,0 +1,73 @@
|
||||
object purgeFrm: TpurgeFrm
|
||||
Left = 0
|
||||
Top = 0
|
||||
Caption = 'Purge options'
|
||||
ClientHeight = 152
|
||||
ClientWidth = 186
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
Position = poMainFormCenter
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object Label1: TLabel
|
||||
Left = 8
|
||||
Top = 8
|
||||
Width = 127
|
||||
Height = 13
|
||||
Caption = 'Choose what to remove...'
|
||||
end
|
||||
object rmFilesChk: TCheckBox
|
||||
Left = 8
|
||||
Top = 35
|
||||
Width = 177
|
||||
Height = 17
|
||||
Caption = 'Non-existent files'
|
||||
Checked = True
|
||||
State = cbChecked
|
||||
TabOrder = 0
|
||||
end
|
||||
object rmRealFoldersChk: TCheckBox
|
||||
Left = 8
|
||||
Top = 58
|
||||
Width = 171
|
||||
Height = 17
|
||||
Caption = 'Non-existent real folders'
|
||||
Checked = True
|
||||
State = cbChecked
|
||||
TabOrder = 1
|
||||
end
|
||||
object rmEmptyFoldersChk: TCheckBox
|
||||
Left = 8
|
||||
Top = 81
|
||||
Width = 177
|
||||
Height = 17
|
||||
Caption = 'Empty folders'
|
||||
Checked = True
|
||||
State = cbChecked
|
||||
TabOrder = 2
|
||||
end
|
||||
object Button1: TButton
|
||||
Left = 8
|
||||
Top = 118
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '&Ok'
|
||||
Default = True
|
||||
ModalResult = 1
|
||||
TabOrder = 3
|
||||
end
|
||||
object Button2: TButton
|
||||
Left = 103
|
||||
Top = 118
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '&Cancel'
|
||||
ModalResult = 2
|
||||
TabOrder = 4
|
||||
end
|
||||
end
|
||||
30
purgeDlg.pas
Normal file
30
purgeDlg.pas
Normal file
@ -0,0 +1,30 @@
|
||||
unit purgeDlg;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, StdCtrls;
|
||||
|
||||
type
|
||||
TpurgeFrm = class(TForm)
|
||||
rmFilesChk: TCheckBox;
|
||||
Label1: TLabel;
|
||||
rmRealFoldersChk: TCheckBox;
|
||||
rmEmptyFoldersChk: TCheckBox;
|
||||
Button1: TButton;
|
||||
Button2: TButton;
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
var
|
||||
purgeFrm: TpurgeFrm;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
end.
|
||||
2
recompile data.bat
Normal file
2
recompile data.bat
Normal file
@ -0,0 +1,2 @@
|
||||
brcc32 data.rc
|
||||
dcc32 hfs -U\code\mine\libs;\code\other\ics\delphi\vc32;\code\other\compiled;c:\code\other\jcl\source\windows\;c:\code\other\jcl\source\common\;C:\progs\Borland\BDS\4.0\lib
|
||||
63
runscriptDlg.dfm
Normal file
63
runscriptDlg.dfm
Normal file
@ -0,0 +1,63 @@
|
||||
object runScriptFrm: TrunScriptFrm
|
||||
Left = 0
|
||||
Top = 0
|
||||
Caption = 'Run script'
|
||||
ClientHeight = 312
|
||||
ClientWidth = 544
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object resultBox: TMemo
|
||||
Left = 0
|
||||
Top = 41
|
||||
Width = 544
|
||||
Height = 271
|
||||
Align = alClient
|
||||
Lines.Strings = (
|
||||
'Write your script in the external editor, then click Run.'
|
||||
'In this box will see the result of the script you run.')
|
||||
TabOrder = 0
|
||||
end
|
||||
object Panel1: TPanel
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 544
|
||||
Height = 41
|
||||
Align = alTop
|
||||
BevelOuter = bvNone
|
||||
TabOrder = 1
|
||||
object sizeLbl: TLabel
|
||||
Left = 503
|
||||
Top = 24
|
||||
Width = 32
|
||||
Height = 13
|
||||
Alignment = taRightJustify
|
||||
Caption = 'Size: 0'
|
||||
end
|
||||
object runBtn: TButton
|
||||
Left = 16
|
||||
Top = 10
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '&Run'
|
||||
TabOrder = 0
|
||||
OnClick = runBtnClick
|
||||
end
|
||||
object autorunChk: TCheckBox
|
||||
Left = 104
|
||||
Top = 16
|
||||
Width = 169
|
||||
Height = 17
|
||||
Caption = '&Auto run at every saving'
|
||||
Checked = True
|
||||
State = cbChecked
|
||||
TabOrder = 1
|
||||
end
|
||||
end
|
||||
end
|
||||
47
runscriptDlg.pas
Normal file
47
runscriptDlg.pas
Normal file
@ -0,0 +1,47 @@
|
||||
unit runscriptDlg;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, StdCtrls, ExtCtrls;
|
||||
|
||||
type
|
||||
TrunScriptFrm = class(TForm)
|
||||
resultBox: TMemo;
|
||||
Panel1: TPanel;
|
||||
runBtn: TButton;
|
||||
autorunChk: TCheckBox;
|
||||
sizeLbl: TLabel;
|
||||
procedure runBtnClick(Sender: TObject);
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
var
|
||||
runScriptFrm: TrunScriptFrm;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
uses
|
||||
main, utilLib, classesLib, scriptLib;
|
||||
|
||||
procedure TrunScriptFrm.runBtnClick(Sender: TObject);
|
||||
var
|
||||
tpl: Ttpl;
|
||||
begin
|
||||
tpl:=Ttpl.create;
|
||||
try
|
||||
try
|
||||
tpl.fullText:=loadTextFile(tempScriptFilename);
|
||||
resultBox.text:=runScript(tpl[''], NIL, tpl);
|
||||
sizeLbl.Caption:=getTill(':', sizeLbl.Caption)+': '+intToStr(length(resultBox.text));
|
||||
except on e:Exception do resultBox.text:=e.message end;
|
||||
finally tpl.free end;
|
||||
end;
|
||||
|
||||
end.
|
||||
2588
scriptLib.pas
Normal file
2588
scriptLib.pas
Normal file
File diff suppressed because it is too large
Load Diff
61
shellExtDlg.dfm
Normal file
61
shellExtDlg.dfm
Normal file
@ -0,0 +1,61 @@
|
||||
object shellExtFrm: TshellExtFrm
|
||||
Left = 226
|
||||
Top = 146
|
||||
Caption = 'Option...'
|
||||
ClientHeight = 265
|
||||
ClientWidth = 388
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
Position = poDesktopCenter
|
||||
OnCreate = FormCreate
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object Image1: TImage
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 388
|
||||
Height = 169
|
||||
Align = alTop
|
||||
AutoSize = True
|
||||
end
|
||||
object Panel1: TPanel
|
||||
Left = 0
|
||||
Top = 169
|
||||
Width = 388
|
||||
Height = 96
|
||||
Align = alClient
|
||||
BevelOuter = bvLowered
|
||||
TabOrder = 0
|
||||
object Label1: TLabel
|
||||
Left = 16
|
||||
Top = 16
|
||||
Width = 215
|
||||
Height = 13
|
||||
Caption = 'Do you want HFS in your shell context menu?'
|
||||
end
|
||||
object Button1: TButton
|
||||
Left = 108
|
||||
Top = 56
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '&Yes'
|
||||
Default = True
|
||||
ModalResult = 6
|
||||
TabOrder = 0
|
||||
end
|
||||
object Button2: TButton
|
||||
Left = 204
|
||||
Top = 56
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '&No'
|
||||
ModalResult = 7
|
||||
TabOrder = 1
|
||||
end
|
||||
end
|
||||
end
|
||||
40
shellExtDlg.pas
Normal file
40
shellExtDlg.pas
Normal file
@ -0,0 +1,40 @@
|
||||
unit shellExtDlg;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, ExtCtrls, StdCtrls, GIFImage, utilLib;
|
||||
|
||||
type
|
||||
TshellExtFrm = class(TForm)
|
||||
Image1: TImage;
|
||||
Panel1: TPanel;
|
||||
Label1: TLabel;
|
||||
Button1: TButton;
|
||||
Button2: TButton;
|
||||
procedure FormCreate(Sender: TObject);
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
var
|
||||
shellExtFrm: TshellExtFrm;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
procedure TshellExtFrm.FormCreate(Sender: TObject);
|
||||
var
|
||||
gif: TGIFImage;
|
||||
begin
|
||||
// turbo delphi doesn't allow me to load a gif from the form designer, so i do it run-time
|
||||
gif:=stringToGif(getRes('shell', 'GIF'));
|
||||
try image1.picture.assign(gif);
|
||||
finally gif.free end;
|
||||
end;
|
||||
|
||||
end.
|
||||
194
todo.txt
Normal file
194
todo.txt
Normal file
@ -0,0 +1,194 @@
|
||||
* consider letting comment "protected" files. Can it really cause harm?
|
||||
* flag to enable lnk files in a folder (disabled by default)
|
||||
experiment session login in place of http authentication
|
||||
+ add mkv mime type http://www.rejetto.com/forum/html-templates/online-video-mkv-player/msg1061237/?topicseen#msg1061237
|
||||
+ sign exe http://www.rejetto.com/forum/hfs-~-http-file-server/'unsafe'/msg1061437/#msg1061437
|
||||
cache reReplace
|
||||
- comments are not updated when moving or renaming files http://www.rejetto.com/forum/bug-reports/descript-ion-and-comment-not-cleaned-up-after-moving-file/
|
||||
+ hash&salt passwords
|
||||
- setInterval > setTimeout
|
||||
+ target=_blank as an option on links
|
||||
- an unsaved VFS will be asked twice if a restart is caused by an update
|
||||
- while renaming a file, CTRL+C/V doesn't work on the text but is handled by the context menu action
|
||||
+ more macros http://www.rejetto.com/forum/index.php/topic,10631.0.html
|
||||
- long folder names are overflowing the tree-box http://www.rejetto.com/forum/index.php/topic,10631.0.html
|
||||
+ {.vfs delete.}
|
||||
+ log: color upload and downloads http://www.rejetto.com/forum/index.php/topic,10202.0.html
|
||||
+ make simple variables work outside connections http://www.rejetto.com/forum/index.php/topic,9805.msg1054886.html#msg1054886
|
||||
+ {.server stop.} http://www.rejetto.com/forum/index.php/topic,9577.msg1054784.html#msg1054784
|
||||
+ macros missing to cache a folder: {.reply|content=|var=|code=|filename=|mime=.}
|
||||
- unexpected scripting behavior http://www.rejetto.com/forum/index.php/topic,9728.msg1054517.html#msg1054517
|
||||
in handleItem() translate only symbols, and run all macros at the end
|
||||
document: [+section]
|
||||
document: {.set item|diff template.}
|
||||
document: single line diff templates
|
||||
document: disconnection reason|if=XXX
|
||||
document: %url%
|
||||
document: commands returning white space: add folder, save, set account, exec, mkdir, chdir, delete, rename, move copy, set
|
||||
document: dir, disk free, filetime, file changed, load tpl
|
||||
+ event to filter logging http://www.rejetto.com/forum/index.php/topic,9784.0.html
|
||||
- wrong browser http://www.rejetto.com/forum/index.php/topic,9710.0.html
|
||||
solution:
|
||||
read HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice::Progid
|
||||
read ROOT\$program-id\shell\open\command::Default
|
||||
* findExtOnStartupChk, when failing, is not reporting the server
|
||||
- better dialog message http://www.rejetto.com/forum/index.php/topic,9778.0.html
|
||||
+ upload to non-browsable folder
|
||||
- android doesn't upload http://www.rejetto.com/forum/index.php/topic,9699.0/topicseen.html#msg1054287
|
||||
- android doesn't work with passwords http://www.rejetto.com/forum/index.php/topic,9575.msg1054029.html#msg1054029
|
||||
? default tpl: check with IE6
|
||||
? default tpl: consider css data uri http://www.nczonline.net/blog/2010/07/06/data-uris-make-css-sprites-obsolete/
|
||||
+ default tpl: support for rawr thumbnails
|
||||
+ next VFS file format version should be XML-based
|
||||
+ remove the "progress" from "log what", and use [progress|no log] instead
|
||||
? {.rename.} should update descript.ion
|
||||
+ folder archive depth limit http://www.rejetto.com/forum/index.php/topic,8546.msg1050027.html#msg1050027
|
||||
? in getPage() many %symbols% are translated in a way incompatible with {.section.}
|
||||
? Windows Script Interfaces
|
||||
? {.image|src=file|width=x|dst=outfile.}
|
||||
+ replace /~imgXX with ?mode=icon&id=XX
|
||||
+ user input through {.dialog.}
|
||||
+ show missing files in VFS http://www.rejetto.com/forum/index.php/topic,8203.new.html
|
||||
* {.cache.} should be able to work on a simple variable
|
||||
+ plugins system http://www.rejetto.com/wiki/index.php/HFS:_plugins_design
|
||||
? tpl as plugin category
|
||||
? try merging 2 implementations of runEventScript()
|
||||
+ support PUT http method
|
||||
? use the system index for faster searching http://msdn.microsoft.com/en-us/library/bb266517(VS.85).aspx http://www.rejetto.com/forum/index.php/topic,7700.msg1047024.html#msg1047024
|
||||
- out of memory / GDI http://www.rejetto.com/forum/index.php/topic,7703.msg1047118.html#msg1047118
|
||||
? consider using tpl.appendString() in getFolderPage() instead of getRecursiveDiffTplAsStr() to avoid some string concatenations
|
||||
? fake the by-default "anyone" in permission/download, to reflect the behavior www.rejetto.com/forum/?topic=7301
|
||||
+ log event to filter www.rejetto.com/forum/?topic=7332.0
|
||||
? integration with mediainfo.dll www.rejetto.com/forum/?topic=7329
|
||||
+ folder archive log, just as for deletion http://www.rejetto.com/forum/index.php?topic=6904.msg1042974;topicseen#msg1042974
|
||||
- upload doesn't work on chinese folders with uneven length www.rejetto.com/forum/?topic=5382
|
||||
- chinese problems since #161 www.rejetto.com/forum/?topic=5344
|
||||
- AV with RealVNC on hints by mouse hovering www.rejetto.com/forum/?topic=5261
|
||||
- N-Stalker can locally crash HFS
|
||||
- AV in #179 http://www.rejetto.com/forum/index.php?topic=5653.msg1033457#msg1033457 www.rejetto.com/forum/?topic=5681
|
||||
- AV in #184 http://www.rejetto.com/forum/index.php?topic=5792.msg1034538#msg1034538
|
||||
- AV in #185 http://www.rejetto.com/forum/indebx.php?topic=5795.msg1034536#msg1034536 www.rejetto.com/forum/?topic=5873
|
||||
- focus problem hovering this hint http://www.rejetto.com/forum/index.php?topic=6321.msg1038272#msg1038272
|
||||
- lock icon is lost on moving http://www.rejetto.com/forum/index.php?topic=6371.msg1038531#msg1038531
|
||||
- there seems to be problems with SMB resources www.rejetto.com/forum/?topic=6365
|
||||
- malfunctions with incorrect timestamps http://www.rejetto.com/forum/index.php?topic=6418.msg1039179#msg1039179
|
||||
? permission events www.rejetto.com/forum/?topic=6698
|
||||
- show error message http://www.rejetto.com/forum/index.php?topic=6695.msg1041212#msg1041212
|
||||
- AV deleting files in #221 www.rejetto.com/forum/?topic=6629
|
||||
+ "no download" should become a permission http://www.rejetto.com/forum/index.php?topic=6870.msg1042583#msg1042583
|
||||
+ http://www.rejetto.com/forum/index.php?topic=6719.msg1041559#msg1041559
|
||||
+ link properties: "open in new window"
|
||||
+ authentication digest
|
||||
+ improve the connections box http://www.rejetto.com/forum/index.php?topic=6689.msg1041182#msg1041182
|
||||
+ ban page can't eventually access template files www.rejetto.com/forum/?topic=6628
|
||||
+ support POSTed files www.rejetto.com/forum/?topic=6618
|
||||
+ clicking on a group, user should get notified of what accounts are part of it
|
||||
+ multi-span folder archive www.rejetto.com/forum/?topic=6575
|
||||
+ an updated hint on virtual folders, to explain how to get upload working
|
||||
- requesting a non-existant file inside an unauthorized folder, apache replies 401, hfs 404. try to comply.
|
||||
+ make %list% available in every page
|
||||
+ support for ALT+F4 with option "Minimize to tray clicking the close button" www.rejetto.com/forum/?topic=6351
|
||||
+ replace and delete icons http://www.rejetto.com/forum/index.php?topic=6317.msg1038157#msg1038157
|
||||
+ self-test supporting https
|
||||
? currently the delete permission is only inside a folder. you can't mark a file or delete the marked folder. is this ok?
|
||||
+ when a link is protected (no access for this user) it may be displayed as a link to the %item-name%, then 401, and if login is successful provide a redirection
|
||||
+ change folder/link/generic-file icons (via GUI, without editing the template)
|
||||
+ a way to get bigger icons (client side)
|
||||
+ be able to produce rss http://www.rejetto.com/forum/index.php?topic=5846.msg1035481#msg1035481
|
||||
* better warning message http://www.rejetto.com/forum/index.php?topic=5795.msg1034406#msg1034406
|
||||
? on the fly files compression www.rejetto.com/forum/?topic=5492
|
||||
? firewall mode www.rejetto.com/forum/?topic=5461
|
||||
? auto-removing folders www.rejetto.com/forum/?topic=3149
|
||||
+ last-access-time for files www.rejetto.com/forum/?topic=5266
|
||||
+ expiration time for account www.rejetto.com/forum/?topic=5409
|
||||
+ warn the user if there's no useful IP address http://www.rejetto.com/forum/index.php?topic=3193.msg1031371#msg1031371
|
||||
+ GUI suggestions www.rejetto.com/forum/?topic=5334
|
||||
+ {.cookie.} http://www.rejetto.com/forum/index.php?topic=5349.0
|
||||
+ restrict access to -> ip mask www.rejetto.com/forum/?topic=5244
|
||||
+ an option to not consider LAN traffic graph/statistics http://www.rejetto.com/forum/index.php?topic=5244.msg1030090#msg1030090
|
||||
+ url command to save the output in a cache, given an ID an an expiry time (minutes?) http://www.rejetto.com/forum/index.php?topic=5239.msg1030223#msg1030223
|
||||
+ ban list sorting (maybe always sort?) www.rejetto.com/forum/?topic=5251
|
||||
? shutdown message www.rejetto.com/forum/?topic=3206
|
||||
+ a variant of ?limit to trim after full listing (rename limit? the other method recalls the SQL limit, would fit better) http://www.rejetto.com/forum/index.php?topic=5196.msg1029734#msg1029734
|
||||
+ show update news inside HFS
|
||||
+ a way to filter/show only "new" files www.rejetto.com/forum/?topic=5227
|
||||
? add to the LOG the X-REQUEST To to be able to know whom the proxy is forwarding to
|
||||
+ a way to add via cmdline a file specifying its virtual name/path
|
||||
? "sticky file" with an hint on adding a leading blank space www.rejetto.com/forum/?topic=5088
|
||||
+ upload file overwriting per-folder www.rejetto.com/forum/?topic=5086
|
||||
+ https
|
||||
+ filter mask based on host, to disconnect who is not using our dyndns
|
||||
+ mouse hovering the graph, shows the speed and time for that point
|
||||
+ per-folder no-limit
|
||||
+ windows auth (NLTM? seems to be available in ICS) www.rejetto.com/forum/?topic=3762
|
||||
+ more stats www.rejetto.com/forum/?topic=4968
|
||||
+ to disable single ban rules
|
||||
+ ban by hostname
|
||||
+ edit comments for real folders www.rejetto.com/forum/?topic=4667
|
||||
+ a way to pass ini commands through the command line
|
||||
+ create folders via command line www.rejetto.com/forum/?topic=3955
|
||||
? support mp3ToIon www.rejetto.com/forum/?topic=4600
|
||||
+ download only for <account-list>
|
||||
+ account: see all transfers in ~progress http://www.rejetto.com/forum/index.php/topic,9325.msg1053416/topicseen.html#msg1053416
|
||||
+ limit account to a host mask
|
||||
+ tray icons for uploads
|
||||
+ MAC filter
|
||||
+ if robots.txt does not exist, an option "don't be listed on search engines"
|
||||
+ menu -> limits -> temporarily disable all limits
|
||||
+ menu -> limits -> max speed for each address
|
||||
+ option to display counter for folders as number of accesses instead of total access to files in it
|
||||
+ autodisabling accounts www.rejetto.com/forum/?topic=5379
|
||||
+ on update, propose a link to the "what's new" page
|
||||
+ add special folder (expert mode): let you specify a special folder, like documents, or manually enter a path (useful for relative paths), or GUID
|
||||
+ logs rotation (hfs always append)
|
||||
+ double address bar, one for LAN and one for the Internet
|
||||
+ per user diff-tpl (apply both folder and user diff-tpl.s, and let the user decide priority, default:user,folder)
|
||||
+ "Folder image mask", a file mask indicating the external file that should be used as icon (~img_folder)
|
||||
+ to be able to add icons from multi-icon files (like shell32.dll)
|
||||
+ installer (saving to registry, and making ini-file the new default, don't ask for shell menu)
|
||||
+ support unicode filenames (FindFirstFileW. Cannot be done because widgets don't support unicode)
|
||||
* show "(home)" instead of "/" in VFS
|
||||
+ show updateinfo notice also in autocheck
|
||||
+ top 10 downloaded files
|
||||
+ after the self test fails, and a router problem is detected, prompt a wizard for portforwad.com (extract routers list)
|
||||
+ export vfs map as txt/html
|
||||
+ specific message for each disabled account
|
||||
+ search for files including meta information (id3 tag) www.rejetto.com/forum/?topic=5312
|
||||
+ multiupload using flash
|
||||
? support shortcut to folders in real-folders
|
||||
* save custom icons in VFS only once
|
||||
+ DNS reverse for ips www.rejetto.com/forum/?topic=4970
|
||||
+ UPnP (www.upnpworks.alcidelic.com/links.html) (www.whitebear.ch) (http://miniupnp.free.fr/) (http://miniupnp.free.fr/files/xchat-upnp20061022.patch)
|
||||
+ UPnP Media Server www.rejetto.com/forum/?topic=5538
|
||||
+ save to registry in different strings
|
||||
+ loading cfg, if version < current then warn user
|
||||
+ auto-ban IP if: bad login X times (with IP exclusion mask) [macros?]
|
||||
+ deny listing and download for uploading files
|
||||
+ download/upload quota (global and account-based)
|
||||
+ purge VFS from unexistant items: files, real folders, virtual folders, empty folders
|
||||
+ custom browser [with an help on how to get a new browser window]
|
||||
+ admin panel (with stats, and maybe commands)
|
||||
+ limit bandwidth/downloads/kb by user, by ip
|
||||
+ external text files with list of authorized IP addresses/accounts
|
||||
+ periodic password changer? (t=1061)
|
||||
+ thumbnails mode (create thumbnails on addition)
|
||||
? socks5
|
||||
+ SSI
|
||||
+ support file renaming notification
|
||||
+ multi-language
|
||||
+ zip format for folder archives
|
||||
* stop using /~commands and move all of them in the standard ?name=value form
|
||||
|
||||
VER 3
|
||||
+ new kind of folder (no more real/virtual folders)
|
||||
|
||||
VER 3.5
|
||||
+ search for files
|
||||
+ file/folder properties in a window (collect menu commands)
|
||||
+ undo (multilevel)
|
||||
|
||||
VER 4
|
||||
+ PHP/ASP via CGI (http://cgi-spec.golux.com/)
|
||||
|
||||
VER 5
|
||||
+ ftp / webdav
|
||||
216
traylib.pas
Normal file
216
traylib.pas
Normal file
@ -0,0 +1,216 @@
|
||||
{
|
||||
Copyright (C) 2002-2008 Massimo Melina (www.rejetto.com)
|
||||
|
||||
This file is part of Http File Server (HFS).
|
||||
|
||||
HFS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
HFS is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with HFS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
}
|
||||
unit traylib;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
forms, ShellAPI, Messages, windows, graphics, sysutils, classes;
|
||||
|
||||
const
|
||||
WM_TRAY = WM_USER+1;
|
||||
type
|
||||
TtrayEvent = (TE_CLICK, TE_2CLICK, TE_RCLICK);
|
||||
TtrayMessageType = (
|
||||
TM_NONE = NIIF_NONE,
|
||||
TM_INFO = NIIF_INFO,
|
||||
TM_WARNING = NIIF_WARNING,
|
||||
TM_ERROR = NIIF_ERROR
|
||||
);
|
||||
|
||||
TNotifyIconDataEx = record
|
||||
cbSize: DWORD;
|
||||
wnd: HWND;
|
||||
uID: UINT;
|
||||
uFlags: UINT;
|
||||
uCallbackMessage: UINT;
|
||||
hIcon: HICON;
|
||||
szTip: array [0..127] of AnsiChar;
|
||||
dwState: DWORD;
|
||||
dwStateMask: DWORD;
|
||||
szInfo: array[0..255] of AnsiChar;
|
||||
uVersion: UINT;
|
||||
szInfoTitle: array[0..63] of AnsiChar;
|
||||
dwInfoFlags: DWORD;
|
||||
end;
|
||||
|
||||
TmyTrayIcon=class
|
||||
private
|
||||
icondata: TNotifyIconDataEx;
|
||||
shown: boolean;
|
||||
procedure wndProc(var Message: TMessage);
|
||||
procedure notify(ev:TtrayEvent);
|
||||
public
|
||||
data: pointer; // user data
|
||||
onEvent: procedure(sender:Tobject; ev:TtrayEvent) of object;
|
||||
constructor create(form:Tform);
|
||||
destructor Destroy; override;
|
||||
procedure minimize;
|
||||
procedure update;
|
||||
procedure hide;
|
||||
procedure show;
|
||||
procedure setIcon(icon:Ticon);
|
||||
procedure setTip(s:string);
|
||||
function balloon(msg:string; secondsTimeout:real=3; kind:TtrayMessageType=TM_NONE; title:string=''):boolean;
|
||||
procedure setIconFile(fn:string);
|
||||
procedure updateHandle(handle:HWND);
|
||||
end; // TmyTrayIcon
|
||||
|
||||
implementation
|
||||
|
||||
var
|
||||
maxTipLength: integer;
|
||||
|
||||
constructor TmyTrayIcon.create(form:Tform);
|
||||
begin
|
||||
with icondata do
|
||||
begin
|
||||
uCallbackMessage := WM_TRAY;
|
||||
cbSize := sizeof(icondata);
|
||||
Wnd := classes.AllocateHWnd(wndproc);
|
||||
uID := 1;
|
||||
uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
|
||||
uVersion:=3;
|
||||
end;
|
||||
setIcon(application.icon);
|
||||
setTip(application.title);
|
||||
end; // create
|
||||
|
||||
destructor TmyTrayIcon.destroy;
|
||||
begin
|
||||
classes.DeallocateHWnd(icondata.wnd);
|
||||
hide;
|
||||
end;
|
||||
|
||||
procedure TmyTrayIcon.updateHandle(handle:HWND);
|
||||
begin
|
||||
if not shown then
|
||||
begin
|
||||
icondata.wnd:=handle;
|
||||
exit;
|
||||
end;
|
||||
hide;
|
||||
icondata.wnd:=handle;
|
||||
Shell_NotifyIcon(NIM_ADD, @icondata)
|
||||
end;
|
||||
|
||||
procedure TmyTrayIcon.update();
|
||||
begin
|
||||
if shown then
|
||||
if not Shell_NotifyIcon(NIM_MODIFY, @icondata) then
|
||||
Shell_NotifyIcon(NIM_ADD, @icondata);
|
||||
end; { update }
|
||||
|
||||
procedure TmyTrayIcon.setIcon(icon:Ticon);
|
||||
begin
|
||||
if icon=NIL then exit;
|
||||
icondata.hIcon:=icon.handle;
|
||||
update();
|
||||
end; { setIcon }
|
||||
|
||||
procedure TmyTrayIcon.setIconFile(fn:string);
|
||||
var
|
||||
ico:Ticon;
|
||||
begin
|
||||
ico:=Ticon.create;
|
||||
try
|
||||
ico.loadFromFile(fn);
|
||||
setIcon(ico);
|
||||
finally ico.free end; // is this ok, or should we ensure the system resource is not deallocated?
|
||||
end; // setIconFile
|
||||
|
||||
procedure TmyTrayIcon.setTip(s:string);
|
||||
begin
|
||||
s:=stringReplace(s,'&','&&',[rfReplaceAll]);
|
||||
if length(s) > maxTipLength then setlength(s,maxTipLength);
|
||||
if string(icondata.szTip) = s then exit;
|
||||
strPLCopy(icondata.szTip, ansiString(s), sizeOf(icondata.szTip)-1);
|
||||
update();
|
||||
end; // setTip
|
||||
|
||||
procedure TmyTrayIcon.minimize();
|
||||
begin
|
||||
show();
|
||||
Application.ShowMainForm := False;
|
||||
// Toolwindows dont have a TaskIcon. (Remove if TaskIcon is to be show when form is visible)
|
||||
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
|
||||
end; // minimizeToTray
|
||||
|
||||
procedure TmyTrayIcon.show();
|
||||
begin
|
||||
if shown then exit;
|
||||
shown:=true;
|
||||
Shell_NotifyIcon(NIM_ADD, @icondata);
|
||||
Shell_NotifyIcon(NIM_SETVERSION, @iconData);
|
||||
end; // show
|
||||
|
||||
procedure TmyTrayIcon.hide();
|
||||
begin
|
||||
if not shown then exit;
|
||||
shown:=FALSE;
|
||||
Shell_NotifyIcon(NIM_DELETE, @icondata);
|
||||
end; // hide
|
||||
|
||||
procedure TmyTrayIcon.wndproc(var Message: TMessage);
|
||||
begin
|
||||
case message.msg of
|
||||
WM_TRAY:
|
||||
case message.lParam of
|
||||
WM_RBUTTONUP: notify(TE_RCLICK);
|
||||
WM_LBUTTONUP: notify(TE_CLICK);
|
||||
WM_LBUTTONDBLCLK: notify(TE_2CLICK);
|
||||
end;
|
||||
WM_QUERYENDSESSION:
|
||||
message.result := 1;
|
||||
WM_ENDSESSION:
|
||||
if TWmEndSession(Message).endSession then
|
||||
hide();
|
||||
NIN_BALLOONHIDE,
|
||||
NIN_BALLOONTIMEOUT:
|
||||
icondata.uFlags := icondata.uFlags and not NIF_INFO;
|
||||
end;
|
||||
message.result:=1;
|
||||
end;
|
||||
|
||||
procedure TmyTrayIcon.notify(ev:TtrayEvent);
|
||||
begin if assigned(onEvent) then onEvent(self, ev) end;
|
||||
|
||||
function TmyTrayIcon.balloon(msg:string; secondsTimeout:real; kind:TtrayMessageType; title:string):boolean;
|
||||
begin
|
||||
case kind of
|
||||
TM_WARNING: icondata.dwInfoFlags:=NIIF_WARNING;
|
||||
TM_ERROR: icondata.dwInfoFlags:=NIIF_ERROR;
|
||||
TM_INFO: icondata.dwInfoFlags:=NIIF_INFO;
|
||||
else icondata.dwInfoFlags:=NIIF_NONE;
|
||||
end;
|
||||
strPLCopy(icondata.szInfo, ansiString(msg), sizeOf(icondata.szInfo)-1);
|
||||
strPLCopy(icondata.szInfoTitle, ansiString(title), sizeOf(icondata.szInfoTitle)-1);
|
||||
icondata.uVersion:=round(secondsTimeout*1000);
|
||||
icondata.uFlags := icondata.uFlags or NIF_INFO;
|
||||
update();
|
||||
icondata.uFlags := icondata.uFlags and not NIF_INFO;
|
||||
result:=TRUE;
|
||||
end; // balloon
|
||||
|
||||
INITIALIZATION
|
||||
if byte(getVersion()) < 5 then maxTipLength:=63
|
||||
else maxTipLength:=127;
|
||||
|
||||
end.
|
||||
5
upload_disabled.txt
Normal file
5
upload_disabled.txt
Normal file
@ -0,0 +1,5 @@
|
||||
You selected a virtual folder.
|
||||
Upload is NOT available for virtual folders, only for real folders.
|
||||
|
||||
=== How to get a real folder?
|
||||
Add a folder from your disk, then click on "Real Folder".
|
||||
10
upload_how.txt
Normal file
10
upload_how.txt
Normal file
@ -0,0 +1,10 @@
|
||||
1. Add a folder (choose "real folder")
|
||||
|
||||
You should now see a RED folder in your virtual file sytem, inside HFS
|
||||
|
||||
2. Right click on this folder
|
||||
3. Properties -> Permissions -> Upload
|
||||
4. Check on "Anyone"
|
||||
5. Ok
|
||||
|
||||
Now anyone who has access to your HFS server can upload files to you.
|
||||
3128
utillib.pas
Normal file
3128
utillib.pas
Normal file
File diff suppressed because it is too large
Load Diff
951
whatsnew.txt
Normal file
951
whatsnew.txt
Normal file
@ -0,0 +1,951 @@
|
||||
HFS - what's new
|
||||
|
||||
LEGEND
|
||||
! very important
|
||||
+ new feature
|
||||
* change
|
||||
- bug fix
|
||||
AV access violation
|
||||
|
||||
VER 2.4
|
||||
propaganda
|
||||
New mobile-friendly template
|
||||
/propaganda
|
||||
+ new default template
|
||||
+ {.set item|name.}
|
||||
+ {.get item|icon.}
|
||||
+ {.set cfg.}
|
||||
+ cache for jquery and template sections
|
||||
+ new template commands: base64, base64decode, md5, sha1
|
||||
- fixed template handling of section names with both '+' and '=' present
|
||||
- fixed LNK files to deleted items
|
||||
- fixed comments files were not updated upon deletion of files
|
||||
- fixed "requesting" forever with empty cookies http://rejetto.com/forum/index.php?topic=13112.0
|
||||
- fixed double "Content-Length" header on compressed pages
|
||||
- fixed log text base color not matching system settings http://rejetto.com/forum/index.php?topic=13233.0
|
||||
|
||||
VER 2.3m
|
||||
propaganda
|
||||
Bug fixes
|
||||
/propaganda
|
||||
+ initial localization support http://www.rejetto.com/forum/programmers-corner/translations-to-other-languages/
|
||||
+ {.remove header.}
|
||||
- fixed error pages' loading problem http://www.rejetto.com/forum/bug-reports/httpauth-challenge-http-headers-bug/
|
||||
- fixed error with {.load.} with size exceeding real size http://rejetto.com/forum/index.php?topic=12059.msg1062781#msg1062781
|
||||
- fixed template translation issues http://rejetto.com/forum/index.php?topic=11880.msg1062167#msg1062167
|
||||
|
||||
VER 2.3k
|
||||
propaganda
|
||||
Bug fixes
|
||||
/propaganda
|
||||
- fixed {.rename.} {.move.} and {.delete.} with lnk files
|
||||
- fixed slowness problem introduced in previous release http://www.rejetto.com/forum/hfs-~-http-file-server/very-slow-loading-on-2-3j-with-userpass-folders/
|
||||
- fixed management of user/pass overlapping accounts
|
||||
- fiexd invisible window http://www.rejetto.com/forum/hfs-~-http-file-server/new-version-2-3j/msg1062129/#msg1062129
|
||||
|
||||
VER 2.3j
|
||||
propaganda
|
||||
Security and bug fixes
|
||||
/propaganda
|
||||
- prevent upload and rename of .lnk files
|
||||
- cache system didn't recognize sub-second changes
|
||||
- fixed chinese search problem http://www.rejetto.com/forum/bug-reports/can-not-search-chinese-word-in-recent-2-3-beta-version/
|
||||
- fixed missing "delete" button
|
||||
- fixed {.add header.} http://www.rejetto.com/forum/staff/proposal-of-update-to-correct-the-macro-'add-header'/msg1061397/#msg1061397
|
||||
- fixed renaming files with dollar sign http://www.rejetto.com/forum/bug-reports/standard-template-rename-does-funny-things-with-$-before-numbers-in-new-name/
|
||||
|
||||
ver 2.3i
|
||||
propaganda
|
||||
Security fix
|
||||
/propaganda
|
||||
+ Report range for partial downloads in the log http://www.rejetto.com/forum/hfs-~-http-file-server/add-to-log-range-(starting-and-ending-byte)/
|
||||
- fixed Remote Command Execution http://www.rejetto.com/forum/bug-reports/execution-exploit/
|
||||
- {.add header.} wasn't overwriting existing headers
|
||||
- temporary files not deleted
|
||||
- incorrect handling of empty rows in ban tables
|
||||
|
||||
ver 2.3h
|
||||
propaganda
|
||||
Bugs fixed
|
||||
/propaganda
|
||||
- account names were uppercased http://www.rejetto.com/forum/bug-reports/account-names/
|
||||
- malformed TAR files with long file paths http://www.rejetto.com/forum/hfs-~-http-file-server/tar-headers-corrupt/
|
||||
- template [+sections] with a plus sign ahead were not working in diff template http://www.rejetto.com/forum/html-templates/disable-right-click-in-template/msg1061207/#msg1061207
|
||||
- in case of lnk files, wrong file size was displayed
|
||||
- a lnk in a folder was stored with the wrong path if downloaded as archive
|
||||
|
||||
ver 2.3g
|
||||
propaganda
|
||||
Bugs fixed
|
||||
/propaganda
|
||||
- general problems navigating folders http://www.rejetto.com/forum/bug-reports/404-not-found-server-error/
|
||||
- default template: comment was not moved with the file http://www.rejetto.com/forum/bug-reports/descript-ion-and-comment-not-cleaned-up-after-moving-file/msg1060608/#msg1060608
|
||||
- request header limit too small, now raised to 16KB
|
||||
|
||||
ver 2.3f
|
||||
propaganda
|
||||
Security fix
|
||||
/propaganda
|
||||
+ new [stream ready] event and %is-archive% symbol http://www.rejetto.com/forum/index.php?topic=8609.msg1060172#msg1060172
|
||||
+ now you can use [upload completed] to refuse uploads http://www.rejetto.com/forum/html-templates/limits-to-upload-files-by-extension-and-size/msg1060476/#msg1060476
|
||||
* no more CDN for jquery
|
||||
- "bad session" error was not handled correctly http://www.rejetto.com/forum/html-templates/troubleshooting-hfs-cookie-issues-on-rename-in-the-default-template
|
||||
- possible XSS with %symbols%, and session stealing (thanks to Daniele Linguaglossa)
|
||||
|
||||
ver 2.3e
|
||||
propaganda
|
||||
Small fixes
|
||||
/propaganda
|
||||
+ upload: multiple file selection
|
||||
+ search accounts by typing the first letter
|
||||
+ smarter speed measure in the log
|
||||
* using jquery's CDN instead of google's
|
||||
- delete not working after archive http://www.rejetto.com/forum/bug-reports/2-3d-(292)-delete-after-archive-repeats-the-archive-download-again/
|
||||
- getUri problem http://www.rejetto.com/forum/programmers-corner/last-beta-sources/msg1059938/#msg1059938
|
||||
- a big MD5 file can hang http://www.rejetto.com/forum/bug-reports/hfs-hangs-on-access/
|
||||
|
||||
ver 2.3d
|
||||
propaganda
|
||||
Security fixes
|
||||
/propaganda
|
||||
- fixed Remote Command Execution CVE-2014-7226 (thanks to Daniele Linguaglossa)
|
||||
- default files were totally overriding the template http://www.rejetto.com/forum/hfs-~-http-file-server/deconfiguring-template/msg1059524/#msg1059524
|
||||
|
||||
ver 2.3c
|
||||
propaganda
|
||||
Security fixes
|
||||
/propaganda
|
||||
* files are reloaded when the timestamp has changed, not only when it's newer
|
||||
- fixed Remote Command Execution CVE-2014-6287 (thanks to Daniele Linguaglossa)
|
||||
- fixed CSRF (thanks to D.L.)
|
||||
- fixed XSS on comments and upload (thanks to D.L.)
|
||||
- program was stuck on lengthy disk harvesting
|
||||
|
||||
ver 2.3b
|
||||
propaganda
|
||||
Security fixes
|
||||
/propaganda
|
||||
- fixed default template for serious security flaws
|
||||
- fixed possible discovery of server paths
|
||||
- fixed "bind root to real folder"
|
||||
- fixed {.load tpl.} not applying to some pages http://www.rejetto.com/forum/html-templates/multiple-templates-based-on-browser/msg1058862/#msg1058862
|
||||
- fixed {.filename.} and {.filepath.} to work with backslashes
|
||||
|
||||
ver 2.3a
|
||||
propaganda
|
||||
Self-test fixed
|
||||
/propaganda
|
||||
- fixed self-test
|
||||
- fixed external IP services
|
||||
+ new event [got header] http://www.rejetto.com/forum/hfs-~-http-file-server/new-events-section/
|
||||
|
||||
ver 2.3
|
||||
propaganda
|
||||
Faster file transfer
|
||||
Brand new template
|
||||
Delete files remotely
|
||||
Scripting system, for both template and automation
|
||||
Account groups
|
||||
More
|
||||
/propaganda
|
||||
+ extreme speed up of VFS loading
|
||||
+ Menu > updates > revert to previous version
|
||||
+ loading of "default.tpl" in the exe's folder
|
||||
+ improved accessibility
|
||||
+ alternative method to get archive: ?mode=archive instead of ~folder.tar (will be deprecated in the future)
|
||||
+ "lan" symbol for address masks
|
||||
+ command line parameter -c to set configuration directly on the command line
|
||||
+ bans: sort button
|
||||
+ "view http header" will now show even incomplete http headers
|
||||
+ the TAR format is more standard compliant (is it?)
|
||||
+ faster self-test
|
||||
+ Log menu -> Log what -> Deletions
|
||||
+ address masks support form 1.2.3.4/5 http://en.wikipedia.org/wiki/CIDR#CIDR_blocks
|
||||
+ new tabbed format for the regular log http://www.rejetto.com/forum/index.php?topic=6719.msg1041763#msg1041763
|
||||
+ improved Windows links support (*.lnk)
|
||||
+ %build-time% in other pages
|
||||
+ now you can archive even search results
|
||||
+ URL parameter "nofolders" for folder archives http://www.rejetto.com/wiki/index.php/HFS:_URL_parameters
|
||||
+ selective folder archive
|
||||
+ new template section [special:alias] http://www.rejetto.com/forum/index.php?topic=6635.msg1040986#msg1040986
|
||||
+ by specifying [+section] instead of [section], the new text will not overwrite a previously existing [section] but will be appended
|
||||
+ Account notes (and related %user-notes%)
|
||||
+ File Menu -> "Properties..."
|
||||
+ Log menu -> "Max lines on screen..."
|
||||
+ added F7 shortcut for accounts
|
||||
+ a way to give access/upload to any account
|
||||
+ Folder menu -> "Delete permissions"
|
||||
+ Options -> MIME types -> "Open directly in browser when MIME type is defined"
|
||||
+ Options -> Accounts -> new "upload" box preview
|
||||
+ Options -> Tray message -> new preview box
|
||||
+ adding an "upload" folder suggest proper settings
|
||||
+ easier way to restore options after "temporarily reset options"
|
||||
+ apache log format improved (more symbols, conditions, parameters)
|
||||
+ template installation through drag&drop
|
||||
+ "addresses ever connected" moved to external file hfs.ips.txt, and hopefully fixed performance problems with many addresses www.rejetto.com/forum/?topic=5716
|
||||
+ per-folder default sorting http://www.rejetto.com/forum/index.php?topic=5656.msg1033337#msg1033337
|
||||
+ Menu -> Other options -> "Prevent system standby on network activity" www.rejetto.com/forum/?topic=5694
|
||||
+ Menu -> Limits -> Speed limit for single address
|
||||
+ customize the default template by putting a [style.user] section in the diff template of the root
|
||||
+ %folder-item-comment% has the same value of %item-comment% in [folder-comment]
|
||||
+ searching ABC* will force the name to begin by ABC, while *ABC force it to be at the end
|
||||
+ automatic comment for the uploaded file
|
||||
+ search results have links to their folder http://www.rejetto.com/forum/index.php?topic=5371.msg1031206#msg1031206
|
||||
+ reverse sorting by clicking twice
|
||||
+ Menu -> URL encoding -> "URLs starting with https instead of http" http://www.rejetto.com/forum/index.php?topic=2002.msg1030879#msg1030879
|
||||
+ Menu -> Other options -> "Dump traffic"
|
||||
+ "dynamic dns updater" automatically disables "find external address on startup" because they are incompatible.
|
||||
+ show header(x-forwarded-for) instead of IP, but only if IP in a customizable ip-mask (127.0.0.1 by default) www.rejetto.com/forum/?topic=5811
|
||||
+ (expert mode) Menu -> Limits -> "Stop spiders" www.rejetto.com/forum/?topic=3097
|
||||
+ proportional files/log size www.rejetto.com/forum/?topic=5310
|
||||
+ log toolbar
|
||||
+ upload filter will by default reject index.htm* and default.htm* files for improved security
|
||||
+ nicer icon for the self test, thanks to Jayrome
|
||||
* "@" allowed in user name
|
||||
* double slash in URL ignored (Apache behaviour)
|
||||
- many bugfixes
|
||||
|
||||
ver 2.2f
|
||||
propaganda
|
||||
Bug and security fixes
|
||||
/propaganda
|
||||
- several progress indicators were stuck to zero
|
||||
- save log had extension .tt instead of .txt
|
||||
- big security problem only for Win95/98/ME (not others): directory crossing www.rejetto.com/forum/?topic=6542
|
||||
- "open it" was not working if the path had spaces http://www.rejetto.com/forum/index.php?topic=6632.msg1040608#msg1040608
|
||||
- setting same name for 2 accounts was not prevented http://www.rejetto.com/forum/index.php?topic=6550.msg1039964#msg1039964
|
||||
* characters ;|^,{} are no more encoded in URLs
|
||||
|
||||
ver: 2.2e
|
||||
propaganda
|
||||
Bug and security fixes
|
||||
/propaganda
|
||||
* double slash in URL ignored (Apache behaviour)
|
||||
- fixed unicode support for uploads
|
||||
- small file upload bug www.rejetto.com/forum/?topic=5044
|
||||
- pendrive support wasn't applied by "edit resource"
|
||||
- NT4 incompatibility with automatic updates
|
||||
- some problems automatic updates
|
||||
- using special characters in username led to hanging connections http://www.rejetto.com/forum/index.php?topic=5573.msg1033030#msg1033030
|
||||
- dynamic dns host was not saved
|
||||
- sometimes it was reported "options saved" when they were not
|
||||
- couldn't load some files with read only attribute
|
||||
- erroneous handling of null chars in the URL
|
||||
- "minimum disk space" not working when using HFS on removable drives
|
||||
- vfs loading could jam www.rejetto.com/forum/?topic=5979
|
||||
- for range "0-0" it was sent the whole file instead of the first byte
|
||||
- "Browse it" wasn't working with links http://www.rejetto.com/forum/index.php?topic=6010.msg1035702#msg1035702
|
||||
- MIME types would not work with blank spaces in file masks
|
||||
- IE6 refresh problem should be now fixed www.rejetto.com/forum/?topic=5376
|
||||
- workaround for IE7 that most times will solve the "underscore_instead_of_spaces" problem www.rejetto.com/forum/?topic=6275
|
||||
|
||||
ver: 2.2d
|
||||
propaganda
|
||||
Bug fixes
|
||||
/propaganda
|
||||
- AV with very long paths and %user% in log filename
|
||||
- missing ":" for port in %host%
|
||||
|
||||
ver: 2.2c
|
||||
propaganda
|
||||
Security fixes
|
||||
/propaganda
|
||||
- prevent possible XSS attack
|
||||
- on specific (non-default) configuration DoS attack and arbitrary file creation was possible
|
||||
- was possible to know the version of HFS even with proper configuration
|
||||
|
||||
ver: 2.2b
|
||||
propaganda
|
||||
Bug fixes
|
||||
/propaganda
|
||||
- forged uploads were able to upload outside the assigned folder
|
||||
- sometimes importing an UTF-8 template resulted in an empty text www.rejetto.com/forum/?topic=5306
|
||||
- files with local characters were not sorted correctly
|
||||
- %item-ext% was not working with enabled "Hide file extension in listing"
|
||||
- folder was left locked after downloading it as archive
|
||||
- incorrect behaviour accessing /~
|
||||
- incorrect handling of // in URI www.rejetto.com/forum/?topic=4969
|
||||
- incorrect behaviour adding an empty CD drives
|
||||
- bad URL for links with ?recursive www.rejetto.com/forum/?topic=5070
|
||||
- archive for subfolders of real folders had a wrong path
|
||||
- fixed unicode support for uploading file names
|
||||
- file icons on Windows98 broken in build #123
|
||||
- URLs to folders with no trailing / were not always redirected
|
||||
|
||||
ver: 2.2a
|
||||
propaganda
|
||||
Bug fixes
|
||||
/propaganda
|
||||
- a protected folder inside a folder protected by different account, was not accessible
|
||||
- occasional wrong URL building (double slash)
|
||||
- invasion of "save file system?" dialogs
|
||||
- AV upgrading
|
||||
- some files had no icon
|
||||
- no more dupe filenames if you add items to a real folder
|
||||
- "hide empty folders" was very slow
|
||||
|
||||
ver: 2.2
|
||||
propaganda
|
||||
Folder archive: download a folder with 1 click
|
||||
Anti-leeching system (download accelerators)
|
||||
better USB drive support
|
||||
Improved usability
|
||||
Lot of new features
|
||||
Many bug fixes
|
||||
/propaganda
|
||||
+ Folder archive
|
||||
+ smarter bandwidth division (between connections)
|
||||
+ specific warning messages on some limits
|
||||
+ Menu -> Limits -> "Allowed referer..." (to stop hotlinking)
|
||||
+ when the port is busy, reports the name of process holding the port
|
||||
+ new log file name symbol: %user%
|
||||
+ new template symbols: %build% %item-ext% %sequential% %number-addresses-ever%
|
||||
+ Log menu -> "Addresses ever connected..."
|
||||
+ File menu -> "Don't log"
|
||||
+ Menu -> Limits -> "Prevent leeching"
|
||||
+ custom symbols %sym-NAME%
|
||||
+ offset and limit URL parameters
|
||||
+ main tray icon shows -> number of different IP addresses
|
||||
+ main tray icon shows -> number of different IP addresses ever connected
|
||||
+ CTRL A in some editors, to select the whole text
|
||||
+ smarter saving prompting
|
||||
+ Menu -> Virtual File System -> "Use OEM for DESCRIPT.ION"
|
||||
+ failed logins are now logged, if enabled Log what -> Other events
|
||||
+ warning message after aborting file addition
|
||||
+ support for dynamic path for the log
|
||||
+ double (or right) clicking on statusbar: "out" opens speed limit, "vfs not saved" opens save dialog
|
||||
+ speed limit is shown in the graph
|
||||
+ remembers edit position for last diff template
|
||||
+ introduced a workaround uploading 2GB+ files with browser not supporting it
|
||||
+ \t (tab) and \n (newline) symbols supported in apache log format
|
||||
+ warning on "don't include port in url"
|
||||
+ if hfs runs on a ble drive, any file on the same drive is pointed relatively (useful for pendrives)
|
||||
+ (expert mode) Log menu -> "Clear and reset totals"
|
||||
+ locks are shown also on the browser (new template symbol: %protected%)
|
||||
* log menu -> log what -> replies ...now disabled by default
|
||||
* log: no more "served" messages after "full downloaded"
|
||||
* Moved some File Menu items in a "Advanced" subgroup
|
||||
* big change for the ON button and the Port box
|
||||
* beta versions will check for new build every 8 hours
|
||||
- the "from stable versions to unstable" was not working with the daily check
|
||||
- "Create fingerprints" misbehaved when fingerprints were disabled
|
||||
- problems with multi monitor
|
||||
- focus problem with options modal off
|
||||
- "copy URL with fingerprint" now visible only for files
|
||||
- virtual file inside real folders made wrong counters
|
||||
- "Minimize to tray clicking the close button" was not working with Aero in Vista
|
||||
- removable drives were not handled correctly with real folders
|
||||
- hovering with mouse while editing a filename in vfs would stop the editing
|
||||
- clicking on statusbar may lead to the wrong dialog
|
||||
- "out of space" was shown also for disconnected drives
|
||||
- possible problem disabling "speed limit"
|
||||
- sometimes reporting "disconnected by server" while it was actually the client
|
||||
- "log icons" now filters also favicon in subfolders
|
||||
- fixed vfs corruption on loading abortion
|
||||
- file list for "/a/new a" was broken
|
||||
- user icon indexes are not fixed, breaking saved iconMasks
|
||||
- problems with the "always on top"
|
||||
- problem with "confirm exit" and windows shutdown
|
||||
- download got corrupted if resumed after 2GB
|
||||
- file list not working with diff template
|
||||
- file list on unexistant path now returns [not found]
|
||||
- occasional AVs
|
||||
- freezing on listing/archiving
|
||||
- didn't save option when the system shuts down
|
||||
- access rights, beside upload rights, are now checked for uploads
|
||||
- inherited files/folders filter was not displayed in hint
|
||||
- fixed possible non standard formatting in cache commands
|
||||
- the connection was unfairly closed/reset after downloads (IE6 sometimes complaining about this)
|
||||
- complains updating
|
||||
- graph visibility was not saved
|
||||
- bad %protected% behaviour
|
||||
- sometimes "Edit HTML template" was not working from the tray icon
|
||||
- @anonymous restriction was considered as protection
|
||||
- using DNS updater, the IP changes when it shouldn't
|
||||
- unicode support for diff tpl
|
||||
- fix for uninstalling error
|
||||
- handle uninstall/update without only1instance
|
||||
- AV on void rename
|
||||
|
||||
ver: 2.1d - build #088
|
||||
propaganda
|
||||
UTF8 support improved
|
||||
bug fixes
|
||||
/propaganda
|
||||
+ Menu -> Virtual File System -> "Reset totals"
|
||||
+ speed limit accepts decimal values
|
||||
* clearing the log no longer reset totals
|
||||
* renamed: "Reset downloads" > "Reset files hits"
|
||||
* renamed: "Don't count as download" > "Don't consider as a download"
|
||||
* renamed: "Save total in/out" > "Save totals", also saves hits/downloads/uploads, enabled by default
|
||||
* show browser icon in address bar
|
||||
- updated template help
|
||||
- UTF8 fix for filename in progress frame (only uploading)
|
||||
- ~specials (urls with ~) didn't work with folders with "?" in the name
|
||||
- holding SHIFT and CTRL keys were undetected at startup
|
||||
- hfs.comments.txt was not used for symbol %folder-comment%
|
||||
- template import/export support for UTF8
|
||||
|
||||
ver: 2.1d - build #086
|
||||
propaganda
|
||||
template features: section aliasing, new symbols, graph colors, better UTF8 support
|
||||
many bug fixes
|
||||
/propaganda
|
||||
+ new template symbols: %total-downloads% %total-uploads% %total-hits% %folder-name% %time-left% %item-folder% %item-url%
|
||||
+ template section aliasing, e.g. [file.gif = file.jpg = file.png]
|
||||
+ Menu -> Other options -> "Default sorting"
|
||||
+ dns updater: host is now automatically included in IP address list
|
||||
+ graph colors customizable via URL
|
||||
+ Upgrading, prompt for saving before quitting
|
||||
+ if an update attempt fails, re-use the already downloaded update
|
||||
+ Menu -> Updates -> "Offer me to update from stable versions to unstable testing versions"
|
||||
* now visible in easy mode: Menu -> Upload -> "How to?"
|
||||
* improved readability in transfer progress bar
|
||||
* renamed: "save in/out totals" > "save total in/out"
|
||||
* non-ascii option applied also inside pages
|
||||
* file menu: now hidden in easy mode: comment, icon, switch to, new link, browse it
|
||||
* file menu: rearranged and renamed some items to improve usability (let download > no download, new folder > new empty folder, copy URL > copy URL address, let browse > browsable)
|
||||
* address bar redesigned
|
||||
* "HFS last update check.tmp" is now created as hidden, less intrusive
|
||||
* now some special files are protected with same access rights as the root folder: /~img*, /~progress, /favicon.ico
|
||||
- fixed UTF-8 support
|
||||
- removed passwords from "show customized options"
|
||||
- dns updater: User and Host are now saved in options
|
||||
- favicon.ico now respect the "log icons" option
|
||||
- uploading, only upload rights were checked but no access rights
|
||||
- "Encode non-ASCII characters" was not working anymore
|
||||
- server refuses to turn on after a "complete" IP change
|
||||
- fixed continous DNS update requests
|
||||
- "Max addresses downloading" was not working
|
||||
- problem fixed with no-ip
|
||||
- fixed support of special characters in folders
|
||||
- it was possible set empty name for folders
|
||||
- possible DoS vulnerability by asking for big graph
|
||||
|
||||
ver: 2.1c - build #071
|
||||
propaganda
|
||||
UTF8 support
|
||||
bug fixes
|
||||
/propaganda
|
||||
+ Menu -> Upload -> "How to?"
|
||||
+ support for UTF-8 templates
|
||||
+ autoupdate clipboard on change ip
|
||||
- no backward compatibility for no-ip
|
||||
- "Check update: failed" every minute
|
||||
- HFS was no more working with "Persistent connections" disabled
|
||||
- "last update check" thing works also without saving options
|
||||
|
||||
ver: 2.1b
|
||||
propaganda
|
||||
autocheck updates
|
||||
bug fixes
|
||||
/propaganda
|
||||
+ Menu -> Updates -> "Auto check every day"
|
||||
+ new template symbol: %ip%
|
||||
+ filelist.tpl is loaded at every change, not only at start
|
||||
+ the "Fully downloaded" event, reports the URL
|
||||
* Build number shown in the title bar
|
||||
* SVG files are added to the default "open directly in browser"
|
||||
- edit template: same shortcut for font and find
|
||||
- solved win9x problem
|
||||
- downloaders browser was not detected
|
||||
|
||||
ver: 2.1a
|
||||
propaganda
|
||||
many bug fixes
|
||||
/propaganda
|
||||
* "Keep old version updating" now disabled by default
|
||||
- forged html could let upload were not allowed
|
||||
- with port different than 80 and "include password in pages" enabled, port was included twice
|
||||
- was unable to interpret no-ip response
|
||||
- problems with unicode encoding of special ascii characters
|
||||
- characters in the "UP" link were not properly encoded
|
||||
- upload is broken sometimes
|
||||
- update feature not working on 98/ME systems
|
||||
- support for 4byte unicode characters
|
||||
- "Let download" erroneously shown for virtual folders
|
||||
|
||||
ver: 2.1
|
||||
propaganda
|
||||
improved usability
|
||||
fingerprints
|
||||
external comments
|
||||
bind to single network interface
|
||||
[file.EXT] sections in template
|
||||
many bug fixes
|
||||
/propaganda
|
||||
+ Menu -> "Accept connections on"
|
||||
+ Menu -> Virtual File System -> "Support DESCRIPT.ION"
|
||||
+ Menu -> Virtual File System -> "Adding folder"
|
||||
+ Menu -> Virtual File System -> "Icon masks..."
|
||||
+ Menu -> Virtual File System -> "Enable recursive listing"
|
||||
+ Menu -> Virtual File System -> "Support Link Fingerprints"
|
||||
+ Menu -> Virtual File System -> "Skip confirmation on deletion"
|
||||
+ Menu -> Other options -> "Input comment on file addition"
|
||||
+ Menu -> Other options -> "Show customized options"
|
||||
+ Menu -> Other options -> "Use ISO date format"
|
||||
+ Menu -> Other options -> "Browse using localhost"
|
||||
+ Menu -> Other options -> "Add icons..."
|
||||
+ Menu -> Dynamic DNS updater -> "Disable"
|
||||
+ Menu -> Fingerprints
|
||||
+ Menu -> URL encoding -> "Unreadable passwords in URLs"
|
||||
+ Menu -> URL encoding -> "Include password in pages"
|
||||
+ Log menu -> Log what -> "Only served requests" (enabled by default)
|
||||
+ File Menu -> "Copy URL with fingerprint"
|
||||
+ File Menu -> "Diff template" (overlap main template)
|
||||
+ File Menu -> "Hide file extention in listing"
|
||||
+ File Menu -> Restrict acces -> "@anonymous"
|
||||
+ File Menu -> Restrict acces -> "New account"
|
||||
+ File Menu -> Upload -> Upload for accounts -> "New account"
|
||||
+ File Menu -> Icon -> "New icon"
|
||||
+ Self Test distinguish between router and firewall problems
|
||||
+ confirm on item deletion
|
||||
+ Self-test now cancelable
|
||||
+ improved file/folder hints
|
||||
+ improved drag&drop scrolling on VFS
|
||||
+ when no port is specified and port 80 is busy, port 8080, 280, 10080 are probed (then dynamic port is used)
|
||||
+ Log menu: clicking "Address 2 name" automatically fills the IP field
|
||||
+ total download counter works now also for real-folders
|
||||
+ symbol ~nodefault to skip the default file
|
||||
+ command line: -a <FILENAME> (load additional ini file)
|
||||
+ support browser cache command (If-Modified-Since)
|
||||
+ [file.<EXT>] sections in template
|
||||
+ "Copy url" now works for multiple files
|
||||
+ double clicking on download tray icon brings to HFS window
|
||||
+ F8 key switches easy/expert
|
||||
+ cancel folder reading if client disconnected (useful for big folders)
|
||||
+ speed up folder sorting (useful for big folders)
|
||||
+ template editor: customizable font and status bar
|
||||
+ sort by hits
|
||||
+ added ini-commmand to be used with -a parameter: "load-tpl-from=FULLPATH"
|
||||
* template: changed default refresh time for progress frame, from 3 to 7 seconds
|
||||
* removed feature: "Visible only to anonymous users"
|
||||
* self test: clearer warning
|
||||
* Set url: old value as default
|
||||
* accept IP masks with less than 3 dots if wildcards are used
|
||||
* %up% %host% in [upload] [upload-results]
|
||||
* renamed items in "Restrict access"
|
||||
* renamed "Get passworded URL" in "Copy URL with password"
|
||||
* split "Copy URL" and "Copy URL with different address"
|
||||
* Users renamed to Accounts
|
||||
- shortcut to folders inside real-folders are unsupported, thus now are correctly not listed
|
||||
- eliminated the lnk2frame() error message
|
||||
- using "Add to HFS" on many folders, many instances stayed open
|
||||
- messages "Cannot open clipboard" now trapped
|
||||
- ~files.lst was not protected
|
||||
- fixed and improved dns updater
|
||||
|
||||
VER: 2.0b
|
||||
- problem with Login and IE
|
||||
|
||||
VER: 2.0a
|
||||
propaganda
|
||||
boosted startup download speed
|
||||
bug fixes
|
||||
/propaganda
|
||||
+ boosted startup download speed
|
||||
- problem requesting folders without including trailing slash
|
||||
- authentication didn't work for URLs http://user:pwd@host/folder (no trailing slash)
|
||||
- "file list" was not affected by "Let browse"
|
||||
- "file list" didn't work for folders with single quotes (')
|
||||
- moving a protected item, didn't paint the lock anymore
|
||||
- "get passwored url" was not working for inherited user/pass
|
||||
- authentication didn't work for URLs http://user:pwd@host/folder (no trailing slash)
|
||||
- other minor bugfixes
|
||||
|
||||
ver: 2.0
|
||||
propaganda
|
||||
Upload
|
||||
Default file mask
|
||||
Easy/Expert mode
|
||||
Load comments from external files
|
||||
Dynamic DNS updater
|
||||
IP-ranges
|
||||
Self Test
|
||||
Uninstall
|
||||
Flag files added recently
|
||||
Apache log file format
|
||||
Autoupdate (automatic download & replace)
|
||||
For full list check the website
|
||||
/propaganda
|
||||
+ File Menu -> Upload (only for real-folders)
|
||||
+ File Menu -> Default file mask
|
||||
+ Easy/Expert mode
|
||||
+ multiselect files
|
||||
+ load comments from external files
|
||||
+ support for IP-ranges (syntax FROM_ADDRESS-TO_ADDRESS)
|
||||
+ you can abort loading VFS and downloading update
|
||||
+ new VFS format with compression
|
||||
+ warn you loading incompatible VFS formats
|
||||
+ Menu -> Start/Exit -> "Only 1 instance"
|
||||
+ Menu -> Other options -> "Compressed browsing"
|
||||
+ Menu -> Other options -> "Delete partial uploads"
|
||||
+ Menu -> Other options -> "Rename partial uploads"
|
||||
+ Menu -> Other options -> "Modal dialog for options"
|
||||
+ Menu -> "Self Test"
|
||||
+ Menu -> "Uninstall"
|
||||
+ Menu -> Virtual File System -> "Flag files added recently"
|
||||
+ Menu -> Virtual File System -> "Auto-save every..."
|
||||
+ Menu -> Tray icons -> The tray icon shows -> "Number of logged uploads"
|
||||
+ Menu -> Start/Exit -> "Confirm exit"
|
||||
+ Menu -> IP address -> "Don't include port in URL"
|
||||
+ Menu -> IP address -> "Find external address"
|
||||
+ Menu -> "Dynamic DNS updater"
|
||||
+ Menu -> Start/Exit -> "Find external address at startup"
|
||||
+ Menu -> Other options -> "Save in/out totals"
|
||||
+ Menu -> Other options -> "Keep old version updating"
|
||||
+ Menu -> Limits -> "Minimum disk space"
|
||||
+ Menu -> Limits -> "Max contemporary downloads"
|
||||
+ Menu -> Limits -> "Max contemporary downloads from single address"
|
||||
+ Menu -> Limits -> "Max contemporary addresses"
|
||||
+ Menu -> Limits -> "Max contemporary addresses downloading"
|
||||
+ Menu -> Flash taskbutton -> "Also beep"
|
||||
+ Menu -> Save options -> "Auto-save every..."
|
||||
+ File Menu -> "Bind/unbind root to real-folder"
|
||||
+ File Menu -> "Switch to real-folder"
|
||||
+ File Menu -> "Don't count as download"
|
||||
+ File Menu -> "Flag as new"
|
||||
+ File Menu -> "Reset <new> flag"
|
||||
+ File Menu -> "Edit resource"
|
||||
+ File Menu -> "Visible only to anonymous users"
|
||||
+ File Menu -> "Let download"
|
||||
+ File Menu -> "Auto-hide empty folders"
|
||||
+ Log Menu -> "Do not log address"
|
||||
+ Log Menu -> "Ban this address" (an address must be at caret position)
|
||||
+ Log Menu -> Log what -> "Banned"
|
||||
+ Log Menu -> "Apache log file format..."
|
||||
+ shell context menu: checkbox instead of add/delete (moved to Other options)
|
||||
+ Template editor -> Find
|
||||
+ warning on many items
|
||||
+ better "open folder" dialog
|
||||
+ "Ignore limits" for accounts
|
||||
+ Bans -> "Add/delete row" (easier to understand)
|
||||
+ new HTML template symbols: you can find a full list in the included help
|
||||
+ file-masks and address-masks now support inverted logic: just put "\" ahead
|
||||
+ pipelined requests now supported
|
||||
+ autoupdate (automatic download & replace)
|
||||
+ /~progress
|
||||
+ multiple custom addresses
|
||||
+ new symbol in tray message: %uploads% (global uploads counter)
|
||||
+ "File list" link generating a list to feed download managers
|
||||
+ new symbols in the log filename for log rotation
|
||||
+ username displayed (when logged in)
|
||||
+ Download counter now works also for real folders
|
||||
+ command line: -d X (waits at start for X tenth of second)
|
||||
+ command line: -q (quit, useful with "only 1 instance")
|
||||
+ command line: -i X (load/save hfs.ini in folder X)
|
||||
+ average speed are logged
|
||||
+ ~files.lst template can be loaded from external file "filelist.tpl"
|
||||
+ first start: a dialog suggest to enable shell integration
|
||||
* hfs.ini by default saved in the same folder with hfs.exe
|
||||
* "copy URL" as submenu
|
||||
* save options -> "delete" replaced by "Clear options and quit"
|
||||
* "No tray icon for file extentions" has been removed because obsolete
|
||||
* symbol %login% renamed in %login-link%
|
||||
* new behaviour for Options dialog
|
||||
* "Abort file addition" more visible
|
||||
* "Access for users" renamed to "Restrict access"
|
||||
* "Run it" renamed to "Open it"
|
||||
* by default config is now saved in user registry
|
||||
* filetime sorts from newer to older
|
||||
- sometimes the VFS was not flagged as modified (and then not auto-saved)
|
||||
- newline problem in tray message
|
||||
- comments were limited to 255 chars
|
||||
- "Flash task button: on download" was flashing on every GET request
|
||||
- clearing the file system, no new file name was asked
|
||||
- problem downloading empty files
|
||||
- "leave disconnected connections" prevented tray icons from being removed
|
||||
- tray icons now display total percentage, to be consistent with the main window
|
||||
- fixed problems with unicode
|
||||
- logging bytes sent/received could stuck
|
||||
- ban list was unproperly saved in configuration
|
||||
- loading a new VFS didn't discard completely old settings
|
||||
- sometimes IE hangs after reaching 100%
|
||||
- ~files.lst showing filenames it shouldn't
|
||||
- "let browse" was not inherited by subfolders of real folders
|
||||
- set user/pass: inputing a password with empty username did not raise error
|
||||
- other minor fixes
|
||||
|
||||
ver: 1.6a
|
||||
propaganda
|
||||
many bug fixes
|
||||
/propaganda
|
||||
- file hints: also inherited user access were shown (while the rest shown is just local)
|
||||
- having folders URLs with no trailing slash, caused problems with some folder/browser pairs
|
||||
- users panel: you was able to enter 2 users with same username
|
||||
- sometimes DEL and CTRL+V shortcuts were lost
|
||||
- port changes were not applied to the address bar
|
||||
- Accept-Ranges was not sent
|
||||
- URL problems with non-latin characters (thanks Pavel Rus)
|
||||
|
||||
ver: 1.6
|
||||
propaganda
|
||||
LOGIN button (browsing)
|
||||
support for external links in the VFS: File Menu -> `New link`
|
||||
customizable 401 and 403 HTTP error pages
|
||||
customizable ban page
|
||||
faster page generation
|
||||
more XP styled
|
||||
support for default favicon.ico (i saw Mozilla using it)
|
||||
new HTML template symbols
|
||||
File hint now additionally displays: users, files/folders filter, realm
|
||||
fixed possible DoS attack
|
||||
4GB single file limit removed
|
||||
many bug fixes
|
||||
/propaganda
|
||||
+ LOGIN button (browsing)
|
||||
+ support for external links in the VFS: File Menu -> "New link"
|
||||
+ customizable 401 and 403 HTTP error pages
|
||||
+ customizable ban page
|
||||
+ faster page generation
|
||||
+ Menu -> Other options -> "Use comment as realm"
|
||||
+ Menu -> Other options -> "Login realm"
|
||||
+ Menu -> Limits -> "Connection inactivity timeout"
|
||||
+ Menu -> Encoding URL -> "Use UNICODE in HTML"
|
||||
+ Menu -> Help -> "Introduction"
|
||||
+ Menu -> Virtual File System -> "Reset hits"
|
||||
+ Menu -> Virtual File System -> "Reset downloads"
|
||||
+ Menu -> "Abort file addition"
|
||||
+ Menu -> "Clear file system"
|
||||
+ File Menu -> Icon
|
||||
+ File Menu -> Switch to virtual
|
||||
+ File Menu -> "Customized realm"
|
||||
+ File Menu -> Access for users -> ALL/NONE
|
||||
+ Log Menu -> "Log what"
|
||||
+ Log Menu -> "Log on video"
|
||||
+ Connections menu -> "Kick idle connections"
|
||||
+ Users -> User properties: browse protected resources by user
|
||||
+ complete downloads counting
|
||||
+ "Time left"
|
||||
+ more XP styled
|
||||
+ added Reset button in "Set user/pass" dialog
|
||||
+ support for default favicon.ico (i saw Mozilla using it)
|
||||
+ new HTML template symbols: %total-bytes%, %total-kbytes%, %total-size% (size of listed files)
|
||||
+ File hint now additionally displays: users, files/folders filter, realm
|
||||
* connections box: merge of "IP" and "User" fields
|
||||
* connections box: "Agent" and "Start time" displayed in tip
|
||||
* folders known before as "autoupdated folders" are now "real folders", others (yellow) are "virtual folders"
|
||||
* "Get passworded URL" doesn't show password anymore
|
||||
* new "let browse" behavior
|
||||
* options saved to file by default
|
||||
* "reload open VFS" by default
|
||||
* username is now case insensitive
|
||||
- problems sending HTTP error pages
|
||||
- problems with files with corrupted timestamp
|
||||
- VFS: minor redrawing problem
|
||||
- "Hide tree" was not propagating to autoupdated folders
|
||||
- hits were not displayed (in tips) for folders
|
||||
- it is safer now during long files addition: files are locked and you can quit the program at once
|
||||
- removed a useless limit on filenames
|
||||
- drag&drop was restricted to labels area
|
||||
- inverted ban logic was not applyed on start (but after opening options window)
|
||||
- the hidden graph was reappearing after a couple of restarts
|
||||
- fixed possible DoS attack
|
||||
- 4GB single file limit removed
|
||||
- whole drives were unsupported
|
||||
- file & folder filters were not applied to subfolders
|
||||
- adding files by copy&paste caused instability
|
||||
- problems with non-virtual shared folders
|
||||
- problems with wildcards
|
||||
- other minor bugs
|
||||
|
||||
ver: 1.5g
|
||||
+ wildcards (*,?) allowed in Bans window
|
||||
+ Menu -> Virtual File System -> "List files with <hidden> attribute"
|
||||
+ Menu -> Virtual File System -> "List files with <system> attribute"
|
||||
+ Menu -> Virtual File System -> "List protected items only for allowed users"
|
||||
+ username is shown in Log and in Connections box
|
||||
+ more distinction between main tray icon and download icons
|
||||
+ Log Menu -> "Font"
|
||||
* moved some options here and there
|
||||
* new GIF library: made by Anders Melander
|
||||
- virtual sub-items of an autoupdated folder were listed also at deeper levels
|
||||
- log font is wrong on some systems
|
||||
- 2GB limit removed on several things (like status bar)
|
||||
- problem with HEAD requests (0 bytes)
|
||||
|
||||
ver: 1.5f
|
||||
+ Dual mode ban list: ban/allow
|
||||
+ Log menu -> "Log file"
|
||||
+ File Menu -> "Hide tree"
|
||||
- hang on starting
|
||||
|
||||
ver: 1.5e
|
||||
- adding an auto-updated folder can cause AV
|
||||
- "speed limit" was not able to get over 10k/s
|
||||
|
||||
ver: 1.5d
|
||||
+ Menu -> Other Options -> "Persistent connections"
|
||||
- files remained blocked (open)
|
||||
- prevents Windows from shutting down
|
||||
|
||||
ver: 1.5c
|
||||
+ improved speed/cpu usage
|
||||
+ Menu -> Other Options -> "Send HFS identifier"
|
||||
- on some systems HFS refuses to open any port for listening
|
||||
- the "no download" timeout was reset only at download start, and not downloading
|
||||
- unstable while user browsing if a "speed limit" was set
|
||||
- files bigger 2Gb+ were not handled
|
||||
- ban was not immediate
|
||||
- the check for duplicate files was case sensitive
|
||||
- AV if quit occours while uploading
|
||||
|
||||
ver: 1.5
|
||||
+ now the statusbar shows the total bytes sent
|
||||
+ Menu -> Other Options -> "Users"
|
||||
+ Menu -> "URL encoding"
|
||||
+ Menu -> Tray Icons -> "Tray message"
|
||||
+ Menu -> Other Options -> "Getright browser specific HTML"
|
||||
+ Menu -> Other Options -> "Auto-save VFS on exit"
|
||||
+ File Menu -> "Get passworded URL"
|
||||
+ File Menu -> "Access for users"
|
||||
+ File Menu -> Filters
|
||||
+ File Menu -> Expand/Collapse
|
||||
+ different tray icon when the server is offline
|
||||
+ items can be added to an autoupdated folder
|
||||
+ customizable "server full" page
|
||||
+ user/pass validation on user input
|
||||
+ statusbar: [not saved] appears when the VFS is edited
|
||||
- you was unable to set a local address if an internet address was available
|
||||
- "Hide" should not be available for the root item
|
||||
- other minor fixes
|
||||
|
||||
ver: 1.5 rc6
|
||||
+ IP address is checked every 10 seconds
|
||||
+ HTML template: %item-added% is the item's addition time
|
||||
+ items' downloads count is now saved to file
|
||||
+ Menu -> Other Options -> "Reload on startup VFS file previously open"
|
||||
+ Menu -> Other Options -> "MIME types"
|
||||
+ Menu -> Other Options -> "Auto-copy URL on start"
|
||||
* added standard "..." to menu
|
||||
- user/pass was not saved for the root item
|
||||
- non-ascii characters were not encoded in the URL
|
||||
|
||||
ver: 1.5 rc5
|
||||
+ you can now hide the bandwidth graph
|
||||
+ Connection menu -> "Pause"
|
||||
+ window position is saved
|
||||
+ Menu -> Other Options -> "Always on top"
|
||||
+ Menu -> Tray icons -> "No tray icon for file extentions"
|
||||
+ Menu -> "Auto-close"
|
||||
+ switching off the server, user is asked for closing open connections
|
||||
+ File Menu -> Edit
|
||||
+ sorting
|
||||
+ F4 switch the server on/off
|
||||
+ log improved
|
||||
+ customizable file-not-found page (404)
|
||||
+ new template symbols: %item-modified% %item-dl-count%
|
||||
+ more info on download tray icons
|
||||
+ brand new html template
|
||||
+ files in VFS that does not exist anymore are not listed while browsing
|
||||
+ check for updates
|
||||
+ browse button
|
||||
+ comment is sent as message/realm to the user/password dialog (if present)
|
||||
+ a padlock is displayed
|
||||
+ Menu -> Limits -> "Bans"
|
||||
+ Menu -> "Recent files"
|
||||
+ Connection Menu -> "Ban IP address"
|
||||
+ F10 shows the main menu
|
||||
+ support for persistent connections (HTTP 1.1)
|
||||
* moved many options to Menu -> "Other options"
|
||||
* when drag&dropping a folder, the dialog for autoupdate is set foreground
|
||||
- problems with url-encoding for … Š <20> • — (IE, Opera)
|
||||
- problems saving a template to registry
|
||||
- sometimes "check for update" was not working after a failure
|
||||
- CRITICAL: directory crossing was possible on autoupdating folders
|
||||
- agent was not shown for folder requests
|
||||
- problems with not-found documents (404)
|
||||
- solved possible DoS attack
|
||||
- internal GIFs were not transparent
|
||||
- password was not applied to items in autoupdated folders
|
||||
- sometimes the server button was ON when the server was OFF
|
||||
- sometimes AV on "Kick IP address"
|
||||
- sometimes the config file was saved in the wrong folder
|
||||
- fast hits cause AVs
|
||||
- several minor bugs fixed
|
||||
|
||||
ver: 1.5 beta1
|
||||
+ user/password protection
|
||||
+ comments for files/folders
|
||||
+ Menu -> Limits -> "Pause streaming"
|
||||
+ hidden items in VFS are painted in italic
|
||||
|
||||
ver: 1.4 beta2
|
||||
+ download tray icons, now % filling
|
||||
+ improved bandwidth graph
|
||||
+ now you can publish files via copy&paste
|
||||
+ now you can publish files via "Add files" and "Add Folder"
|
||||
+ Menu -> Weblinks
|
||||
|
||||
ver: 1.4 beta1
|
||||
+ Menu -> Limits -> "Speed limit"
|
||||
+ Menu -> Limits -> "Max connections", "Max connections for single address"
|
||||
+ Menu -> Save options -> "Auto-save options on exit"
|
||||
+ speed improvement, over 3Mb/s on my Duron@1300
|
||||
+ smarter tray refresh (less CPU)
|
||||
- hiding a file, adjacent one was hidden too
|
||||
|
||||
ver: 1.3 beta8
|
||||
- custom ip was never selected on start
|
||||
|
||||
ver: 1.3 beta7
|
||||
+ Menu -> "Use system icons"
|
||||
+ Menu -> "Official website"
|
||||
+ Menu -> Tray icons -> "Show main tray icon"
|
||||
* new tray icon
|
||||
- invalid mime-type was sent for GIF files
|
||||
- individual tray icons for downloads were not working
|
||||
|
||||
ver: 1.3 beta6
|
||||
- forgot to encode blank-spaces in clipboard
|
||||
|
||||
ver: 1.3 beta5
|
||||
+ "Custom ip", now you can use yourowndomain.com
|
||||
- autoupdate folders was not applying the "Folders before" setting
|
||||
- there were problems with url-encoding for blank-space, ø and "
|
||||
- some crashes may have been fixed
|
||||
|
||||
ver: 1.3 beta4
|
||||
+ added GIF support for internal images (requires JVCL library)
|
||||
* brand new html template
|
||||
- kick all connections was not working
|
||||
- html folder pages were not served for folders with 1 single item, and hidden
|
||||
|
||||
ver: 1.3 beta3
|
||||
+ added CRC checking to VFS files
|
||||
|
||||
ver: 1.3 beta2
|
||||
+ check for same filename in same folder
|
||||
* new icons
|
||||
- %folder% in template was not url-decoded
|
||||
- problems with URLs encoding
|
||||
|
||||
ver: 1.3 beta1
|
||||
+ Autoupdate folders
|
||||
+ "Leave disconnected connections" in connections menu
|
||||
+ smarter "agent" colum
|
||||
+ Bandwidth graph
|
||||
* Loading a project the tree is not expanded
|
||||
- Problems with special characters
|
||||
- While editing the filename, Delete key deletes the file
|
||||
- "Tray icon for each download" was not saved
|
||||
- Renaming a virtual folder was not applied on the web
|
||||
|
||||
ver: 1.2
|
||||
+ "Tray icon for each download" in main menu
|
||||
+ Drastic speed up on fast downloads (LAN)
|
||||
- Closing HFS with open connections causes AV
|
||||
- Fast hits cause AV
|
||||
|
||||
ver: 1.1
|
||||
+ "agent" column for connections
|
||||
+ colored log
|
||||
- StarDownloader was not recognizing resume feature
|
||||
- On fast downloads (LAN), information on window was not updated
|
||||
- Resume was not always working correctly
|
||||
|
||||
ver: 1.0
|
||||
first sane release, fully rewritten
|
||||
|
||||
ver: 0.1
|
||||
please, forget it
|
||||
Loading…
Reference in New Issue
Block a user