rejetto forum

Software => HFS ~ HTTP File Server => Bug reports => Topic started by: raybob on June 22, 2011, 08:02:53 PM

Title: true statement showing false
Post by: raybob on June 22, 2011, 08:02:53 PM
I may be doing something wrong but in the [folder] section, there's a little issue.

If I put in %number-folders% and {.add|{.count|folder level.}|1.}, in the lowest folder row the numbers will be the same, looking something like this:

(http://www.internet-drive.tk/.beckr/shared/F95JHKD938TJHJD99GKDI49HIRKHKFJ4----question.png)

And yet, when I put in the statement {.=|%number-folders%|{.add|{.count|folder level.}|1.}.} it always comes out false even in a row where the two numbers are equal.
Title: Re: true statement showing false
Post by: r][m on June 23, 2011, 05:09:50 AM
Doesn't %sequential% give similar result?
Title: Re: true statement showing false
Post by: raybob on June 23, 2011, 11:19:54 AM
Yes that works better, thanks.
Title: Re: true statement showing false
Post by: rejetto on June 24, 2011, 02:14:11 PM
solved?
Title: Re: true statement showing false
Post by: raybob on June 25, 2011, 04:24:54 AM
Well the original problem still exists I just found an alternative.
Title: Re: true statement showing false
Post by: rejetto on July 02, 2011, 09:55:20 PM
i was passing by in a rush and just asked.
now i worked on it and finally understood why it doesn't work.

%number-folders% (and some other symbols) is translated to a number only AFTER the scripting of every file/folder is executed.
this is not actually necessary, and i think i can change it so to solve such problems without side effects.
Sadly i cannot do it right now because i recently changed my hard disk and have to reinstall some things.
I will put this in the to-do list.

I doubt the %sequential% solved your problem.
Title: Re: true statement showing false
Post by: Mars on July 03, 2011, 05:29:01 PM
It is not absolutely necessary to change whatever it is about %number-folders%, it work fine

this variable gives the total of folders (%number-folders%) of the current directory and is défined at the end of the search process of all items (%number%)

it's same with links (%number-links%) and files (%number-files%)

A possibility is to obtain directly the available information with my mod (exist since build 186):

Quote
 procedure handleItem(f:Tfile);
....

  addArray(md.table, [
    '%item-index%', inttostr(if_(type_='file',numberFiles)+if_(type_='link',numberLinks)+if_(type_='folder',numberFolders)),  //add by mars
    '%item-number%', inttostr(numberFiles+numberLinks+numberFolders),  //add by mars replace usage of limited %sequential%
    '%item-type%', type_
  ]);

  s:=xtpl(s, nonPerc);
  md.f:=f;
  tryApplyMacrosAndSymbols(s, md, FALSE);
  fast.append(s);
  end; // handleItem


%item-number% / %number%      index of an element of all items

Other :
[folder=file=link]
%item-index% / {.switch|%type%|;|folder|%number-folders%|link|%number-links%|file|%number-files%.}

it's possible to use the next lines after corrected a bug in parser.lib
[folder=file=link]
%item-index% / %number-%item-type%s%

to avoid bug:
Quote
 procedure handleSymbols();
....
    newS:=cb(s, NIL, cbData);
    if s = newS then begin dec(e); continue; end;  //we have to restart parser from the last % of %text% when text is not in the list else recurse not working
....
end;



Title: Re: true statement showing false
Post by: rejetto on July 04, 2011, 04:06:29 PM
@mars, i don't think you understood what's behind the problem reported.
1. I think your suggestion doesn't solve the problem, indeed.
Did you try to use {.=|%item-number%|%number-folders%.} ?
Of course this test makes sense only if they are all folders, but let it be, just for the sake of the test.
Let me know the result, i'm interested.

2. your suggestion doesn't let the user count only the folders, in case he needs to (that's only when the "folders before" is disabled)

3. It's not exactly a bug, it's just a limit, but it's ok if we can get more things to work with a small change.
The question is: with the change you suggested, will we have some side effects, like correct templates that stop working?
At the moment i cannot test myself, because Windows7 64bit is preventing me from installing Turbo Delphi. I'm working on it.
Title: Re: true statement showing false
Post by: Mars on July 04, 2011, 04:30:36 PM
Quote
The question is: with the change you suggested, will we have some side effects, like correct templates that stop working?

There is already a security which was introduced in parser.lib again infinite loop with the constant MAX_RECUR_LEVEL = 50;
 and this line
    if alreadyRecurredOn(s) then continue; // the user probably didn't meant to create an infinite loop


Quote
2. your suggestion doesn't let the user count only the folders, in case he needs to (that's only when the "folders before" is disabled)

it's will be good to have his full template, i believe that we miss some elements to be able to estimate completely his problem
Quote
1. I think your suggestion doesn't solve the problem, indeed.
Did you try to use {.=|%item-number%|%number-folders%.} ?
Of course this test makes sense only if they are all folders, but let it be, just for the sake of the test.
Let me know the result, i'm interested.

It makes no sense of use {.=|%item-number%|%number-folders%.}, truth syntax to be used as I suggest him(it) in the modification is {.=|%item-index%|%number-folders%.}, but only if you accept the update

%item-number% must be used with %number%

Title: Re: true statement showing false
Post by: rejetto on July 13, 2011, 12:52:13 PM
0. i didn't mean specifically infinite loops, but any unwanted side effect
1. whatever. did you try it? i don't think it works, %item-index% or %item-number%.
because the comparison is made at stage where %item-index% is translated but %number-folders% is not.
so the first one is translated to a number, while the second one is left as %number-folders%.
the comparison result is necessarily false.
Title: Re: true statement showing false
Post by: Mars on July 13, 2011, 05:42:38 PM
found  as solution to translate  %item-index%, %number-folders%, %number-files%, %number-links% at same stage

this answer your question: "Did you try to use {.=|%item-number%|%number-folders%.} ?"
   NOW WORKING:
Code: [Select]
function Tmainfrm.getFolderPage(folder:Tfile; cd:TconnData; otpl:Tobject):string;
// we pass the Tpl parameter as Tobject because symbol Ttpl is not defined yet

var
  baseurl, list, fileTpl, folderTpl, linkTpl: string;
  table: TStringDynArray;
  ofsRelItemUrl, ofsRelUrl, numberFiles, numberFolders, numberLinks: integer;
  indexFiles, indexFolders, indexLinks: integer;
  img_file: boolean;
  totalBytes: int64;
  fast: TfastStringAppend;
  buildTime: Tdatetime;
  listing: TfileListing;
  diffTpl: Ttpl;
  isDMbrowser: boolean;
  hasher: Thasher;
  fullEncode, recur, oneAccessible: boolean;
  md: TmacroData;

  procedure applySequential();
  const
    PATTERN = '%sequential%';
  var
    idx, p: integer;
    idxS: string;
  begin
  idx:=0;
  p:=1;
    repeat
    p:=ipos(PATTERN, result, p);
    if p = 0 then exit;
    inc(idx);
    idxS:=intToStr(idx);
    delete(result, p, length(PATTERN)-length(idxS));
    move(idxS[1], result[p], length(idxS));
    until false;
  end; // applySequential

  procedure handleItem(f:Tfile);
  var
    type_, s, url, fingerprint, itemFolder: string;
    nonPerc: TStringDynArray;
  begin
  if not f.isLink and ansiContainsStr(f.resource, '?') then exit; // unicode filename?   //mod by mars

  if f.size > 0 then inc(totalBytes, f.size);

  // build up the symbols table
  md.table:=NIL;
  nonPerc:=NIL;
  if f.icon >= 0 then
    begin
    s:='~img'+intToStr(f.icon);
    addArray(nonPerc, ['~img_folder', s, '~img_link', s]);
    end;
  if f.isFile() then
    if img_file and (useSystemIconsChk.checked or (f.icon >= 0)) then
      addArray(nonPerc, ['~img_file', '~img'+intToStr(f.getSystemIcon())]);

  if recur or (itemFolder = '') then
    itemFolder:=optUTF8(diffTpl, f.getFolder());
  if recur then
    url:=substr(itemFolder, ofsRelItemUrl)
  else
    url:='';
  addArray(md.table, [
    '%item-folder%', itemFolder,
    '%item-relative-folder%', url
  ]);

  if not f.accessFor(cd) then
    s:=diffTpl['protected']
  else
    begin
    s:='';
    if f.isFileOrFolder() then
      oneAccessible:=TRUE;
    end;
  addArray(md.table, [
    '%protected%', s
  ]);

  // url building
  fingerprint:='';
  if fingerprintsChk.checked and f.isFile() then
    begin
    s:=loadMD5for(f.resource);
    if s = '' then s:=hasher.getHashFor(f.resource);
    if s > '' then fingerprint:='#!md5!'+s;
    end;
  if f.isLink() then
    begin
    url:=f.resource;
    s:=url;
    end
  else
    if pwdInPagesChk.Checked and (cd.usr > '') then
      begin
      if encodePwdUrlChk.checked then s:=totallyEncoded(cd.pwd)
      else s:=encodeURL(cd.pwd);
      s:=f.fullURL( encodeURL(cd.usr)+':'+s, getSafeHost(cd) )+fingerprint;
      url:=s
      end
    else
      begin
      if recur then
        s:=copy(f.url(fullEncode), ofsRelUrl, MAXINT)+fingerprint
      else
        s:=f.relativeURL(fullEncode)+fingerprint;
      url:=baseurl+s;
      end;
  if not f.isLink() then
    begin
    s:=macroQuote(s);
    url:=macroQuote(url);
    end;
  addArray(md.table, [
    '%item-url%', s,
    '%item-full-url%', url
  ]);

  // select appropriate template
  if f.isLink() then
    begin
    s:=linkTpl;
    inc(indexLinks);
    type_:='link';
    end
  else if f.isFolder() then
    begin
    s:=folderTpl;
    inc(indexFolders);
    type_:='folder';
   end
  else
    begin
    s:=diffTpl.getTxtByExt(ExtractFileExt(f.name));
    if s = '' then s:=fileTpl;
    inc(indexFiles);
    type_:='file';
    end;

  addArray(md.table, [
    '%number-files%', intToStr(numberFiles),
    '%number-folders%', intToStr(numberFolders),
    '%number-links%', intToStr(numberlinks),
    '%number%', inttostr(numberFiles+numberFolders+numberlinks),
    '%item-index%', inttostr(if_(type_='file',indexFiles)+if_(type_='link',indexLinks)+if_(type_='folder',indexFolders)),  //add by mars
    '%item-number%', inttostr(indexFiles+indexLinks+indexFolders),  //add by mars replace usage of limited %sequential%
    '%item-type%', type_
  ]);

  s:=xtpl(s, nonPerc);
  md.f:=f;
  tryApplyMacrosAndSymbols(s, md, FALSE);
  fast.append(s);
  end; // handleItem

var
  i: integer;
begin
result:='';
if (folder = NIL) or not folder.isFolder() then exit;

if macrosLogChk.checked and not appendmacroslog1.checked then
  resetLog();
diffTpl:=Ttpl.create();
folder.lock();
try
  buildTime:=now();
  cd.conn.addHeader('Cache-Control: no-cache, no-store, must-revalidate, max-age=-1');
  recur:=shouldRecur(cd);
  baseurl:=protoColon()+getSafeHost(cd)+folder.url(TRUE);

  if cd.tpl = NIL then
    diffTpl.over:=otpl as Ttpl
  else
    begin
    diffTpl.over:=cd.tpl;
    cd.tpl.over:=otpl as Ttpl;
    end;

  if otpl <> filelistTpl then
    diffTpl.fullText:=optUTF8(diffTpl.over, folder.getRecursiveDiffTplAsStr());

  isDMbrowser:= otpl = dmBrowserTpl;
  fullEncode:=not isDMbrowser;
  ofsRelUrl:=length(folder.url(fullEncode))+1;
  ofsRelItemUrl:=length(optUTF8(diffTpl, folder.pathTill()))+1;
  // pathTill() is '/' for root, and 'just/folder', so we must accordingly consider a starting and trailing '/' for the latter case (bugfix by mars)
  if not folder.isRoot() then
    inc(ofsRelItemUrl, 2);

  fillChar(md, sizeOf(md), 0);
  md.cd:=cd;
  md.tpl:=diffTpl;
  md.folder:=folder;
  md.archiveAvailable:=folder.hasRecursive(FA_ARCHIVABLE) and not folder.isDLforbidden();
  md.hideExt:=folder.hasRecursive(FA_HIDE_EXT);

  result:=diffTpl['special:begin'];
  tryApplyMacrosAndSymbols(result, md, FALSE);

  // cache these values
  fileTpl:=xtpl(diffTpl['file'], table);
  folderTpl:=xtpl(diffTpl['folder'], table);
  linkTpl:=xtpl(diffTpl['link'], table);
  // this may be heavy to calculate, only do it upon request
  img_file:=pos('~img_file', fileTpl) > 0;

  // build %list% based on dir[]
  numberFolders:=0; numberFiles:=0; numberLinks:=0;
  indexLinks:=0; indexFolders:=0; indexFiles:=0;

  totalBytes:=0;
  oneAccessible:=FALSE;
  fast:=TfastStringAppend.Create();
  listing:=TfileListing.create();
  hasher:=Thasher.create();
  hasher.loadFrom(folder.resource);
  try
    listing.fromFolder( folder, cd, recur );
    listing.sort(cd, if_(recur or (otpl = filelistTpl), '?', diffTpl['sort by']) ); // '?' is just a way to cause the sort to fail in case the sort key is not defined by the connection

    for i:=0 to length(listing.dir)-1 do
      if listing.dir[i].isLink() then  inc(numberLinks)
        else if ansiContainsStr(listing.dir[i].resource, '?') then continue
            else if listing.dir[i].isFolder() then inc(numberFolders)
              else inc(numberFiles);

    for i:=0 to length(listing.dir)-1 do
      begin
      application.ProcessMessages();
      if cd.conn.state = HCS_DISCONNECTED then exit;
      cd.lastActivityTime:=now();
      handleItem(listing.dir[i])
      end;
    list:=fast.reset();
  finally
    listing.free;
    fast.free;
    hasher.free;
    end;

  if cd.conn.state = HCS_DISCONNECTED then exit;

  // build final page
  if not oneAccessible then md.archiveAvailable:=FALSE;
  md.table:=toSA([
    '%number-files%', intToStr(numberFiles),
    '%number-folders%', intToStr(numberFolders),
    '%number-links%', intToStr(numberlinks),
    '%number%', inttostr(numberFiles+numberFolders+numberlinks),
    '%upload-link%', if_(accountAllowed(FA_UPLOAD, cd, folder), diffTpl['upload-link']),
    '%files%', if_(list='', diffTpl['nofiles'], diffTpl['files']),
    '%list%',list,
    '%total-bytes%', intToStr(totalBytes),
    '%total-kbytes%', intToStr(totalBytes div KILO),
    '%total-size%', smartsize(totalBytes)
  ]);
  result:=diffTpl[''];
  md.f:=NIL;
  md.afterTheList:=TRUE;
  try tryApplyMacrosAndSymbols(result, md)
  finally md.afterTheList:=FALSE end;
  applySequential();
  // ensure this is the last symbol to be translated
  result:=xtpl(result, [
    '%build-time%', floatToStrF((now()-buildTime)*SECONDS, ffFixed, 7,3)
  ]);
finally
  folder.unlock();
  diffTpl.free;
  end;
end; // getFolderPage

PS: those lines are necessary for two different places
Code: [Select]
    '%number-files%', intToStr(numberFiles),
    '%number-folders%', intToStr(numberFolders),
    '%number-links%', intToStr(numberlinks),
    '%number%', inttostr(numberFiles+numberFolders+numberlinks),

and the part of tpl

Code: [Select]
[file=folder=link|private]
<tr class='{.if|{.mod|{.count|row.}|2.}|even.}'><td>
%item-number%/%number% {.if |{.=|%item-number%|%number%.}|(last item )|(not last item).} -- %item-index%/{.switch|%item-type%|;|folder|%number-folders%|link|%number-links%|file|%number-files%.}  {.if|{.=|%item-index%|{.switch|%item-type%|;|folder|%number-folders%|link|%number-links%|file|%number-files%.} .}|(last %item-type%)|(not last %item-type%).}
        <input type='checkbox' class='selector' name='selection' value='%item-url%' {.if not|{.or|{.get|can delete.}|{.get|can access.}|{.get|can archive item.}.}|disabled='disabled'.} />
{.if|{.get|is new.}|<span class='flag'>&nbsp;NEW&nbsp;</span>.}
{.if not|{.get|can access.}|<img src='/~img_lock'>.}
<a href="%item-url%"><img src="%item-icon%"> %item-name%</a>
{.if| {.?search.} |{:{.123 if 2|<div class='item-folder'>{.!item folder.} |{.breadcrumbs|{:<a href="%bread-url%">%bread-name%/</a>:}|from={.count substring|/|%folder%.}/breadcrumbs.}|</div>.}:} .}
{.123 if 2|<div class='comment'>|{.commentNL|%item-comment%.}|</div>.}

[+file]
<td>%item-size%B<td>%item-modified%<td>%item-dl-count%

[+folder]
<td class='nosize'>folder<td>%item-modified%<td>%item-dl-count%

[+link]
<td class='nosize'>link<td colspan='2'>