first commit

This commit is contained in:
Massimo Melina 2020-05-02 19:04:16 +02:00
commit b654228675
75 changed files with 35161 additions and 0 deletions

13
.gitignore vendored Normal file
View File

@ -0,0 +1,13 @@
tmp/
__history/
__recovery/
win32/
*.vfs
*.dcu
*.exe
*.map
hfs.ini
*.tmp
*.bak
*.*-
*.corrupted

21
WindowsXP.manifest Normal file
View 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
View 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

File diff suppressed because it is too large Load Diff

6
copyright.txt Normal file
View 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
View File

@ -0,0 +1 @@
127.0.0.1=(Private Address) (XX)

BIN
data.RES Normal file

Binary file not shown.

12
data.rc Normal file
View 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

File diff suppressed because one or more lines are too long

11
defs.inc Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View File

@ -0,0 +1,11 @@
%files%
[files]
%list%
[file]
%item-full-url%
[folder]
%item-full-url%

417
filepropDlg.dfm Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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>

1505
hfs.drc Normal file

File diff suppressed because it is too large Load Diff

185
hfs.dsk Normal file
View 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
View File

@ -0,0 +1,3 @@
[+download]
{.remove header|ETag.}
{.remove header|Set-cookie.}

BIN
hfs.identcache Normal file

Binary file not shown.

BIN
hfs.otares Normal file

Binary file not shown.

28
hfs.pas Normal file
View 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.res Normal file

Binary file not shown.

BIN
hfs.tpl Normal file

Binary file not shown.

BIN
hfs.vrc Normal file

Binary file not shown.

BIN
hfs_Icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
hfs_Icon1.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
hfs_Icon2.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

1689
hslib.pas Normal file

File diff suppressed because it is too large Load Diff

10
invertban.txt Normal file
View 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
View 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
View 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
View File

@ -0,0 +1,2 @@
http://hfsservice.rejetto.com/ip.php|!
http://checkip.dyndns.org|:

7
jquery.min.js vendored Normal file

File diff suppressed because one or more lines are too long

54
listSelectDlg.dfm Normal file
View 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
View 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
View 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
View 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

File diff suppressed because one or more lines are too long

3449
main.dfm Normal file

File diff suppressed because it is too large Load Diff

12371
main.pas Normal file

File diff suppressed because it is too large Load Diff

110
monoLib.pas Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

BIN
shell.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

61
shellExtDlg.dfm Normal file
View 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
View 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
View 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
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

951
whatsnew.txt Normal file
View 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