/*  $VER: Cache.www 1.4 (28.9.95) Stephan Lichtendahl
Caching of inlined images and HTML documents on harddisk */

cachedir='AmiTCP:Cache/'
copycom='Copy Quiet'

if ~show(l,'rexxsupport.library') then
  if ~addlib('rexxsupport.library',0,-30,0) then
    exit
if ~show(l,'rexxdossupport.library') then
  if ~addlib('rexxdossupport.library',0,-30,2) then
    exit                                           .

hit=0
HTML=''
Image=''
saveto=''
ret='0a'x
OPTIONS RESULTS

parse arg args
if ~ReadArgs(args,'Save/S,Load/S,Remove/S,Image/K,HTML/K') then do
  say 'Usage: Cache.www [Save] to get/put images in current AMosaic'
  say 'document from/to cache, Save will save HTML document as well.'
  say 'Cache.www Image/K HTML/K will delete <image> and/or <html> from'
  say 'cache. <image> and <html> can be URLs, filenames or both ALL.'
  say 'Remove will remove the current AMosaic document from cache,'
  say 'and every image in it which is currently visable (ie. loaded).'
  say 'Cache.www Load reloads the current cached document from WWW.'
  return 0
end
if Image ~= '' | HTML ~= '' then do
  if upper(Image) = 'ALL' & upper(HTML) = 'ALL' then
    call AllesWeg
  else do
    if Image ~= '' then do
      type=1
      call WisItem
    end
    if HTML ~= '' then do
      type=0
      call WisItem
    end
  end
  return 0
end

if ~Load & ~Remove then do
  address AMOSAIC.1 'fetch images IMAGE'

  call open(1input,cachedir'ImageList','R')
  imagelist = readch(1input,65535)
  call close(1input)

  do i=1 for image.0
    nieuw.i=0
    urlnaam=image.i.url
    av=image.i.current

    if left(urlnaam,17) = 'file://localhost/' then do
      if ~av then
        address AMOSAIC.1 'fetch inline url 'urlnaam
     end
    else do
      nr = pos(urlnaam,imagelist)

      if nr = 0 & av then do
        call open(2input,cachedir'NrOfImage','R')
        imgnr = readln(2input)+1
        call close(2input)

        address command copycom '"'image.i.filename'"' cachedir'Images/'imgnr
        address command 'Echo >>'cachedir'ImageList "'imgnr','urlnaam'"'
        imagelist=imagelist||imgnr','urlnaam||ret
        nieuw.i=imgnr

        call open(2output,cachedir'NrOfImage','W')
        call writeln(2output,imgnr)
        call close(2output)
      end

      if nr > 0 then do
        startnr = lastpos(ret,imagelist,nr)+1
        imgnr = substr(imagelist,startnr,nr-startnr-1)
        nieuw.i=imgnr
        if av then
          address command copycom '"'image.i.filename'"' cachedir'Images/'imgnr
        else
          hit=2
      end

    end
  end
end

address AMOSAIC.1 'get url'
urlnaam = result
if Remove then
  call RemHTML

if Load | Save then do
  if left(urlnaam,27) = 'file://localhost/T:temphtml' then
    address AMOSAIC.1 'jump back'
  else do

    call open(3input,cachedir'HTMLlist','R')
    htmllist = readch(3input,65535)
    call close(3input)
    dir=cachedir'HTMLs/'

    nr = pos(dir,urlnaam)
    if nr > 0 then do
      saveto = substr(urlnaam,nr+length(dir))
      nr = pos(saveto',',htmllist)
      startnr = nr+length(saveto)+1
      stopnr = pos(ret,htmllist,startnr+1)
      urlnaam = substr(htmllist,startnr,stopnr-startnr)
      if Load then
        address AMOSAIC.1 'jump url 'urlnaam
      else
        hit=hit+1

     end
    else
      if Save then do
        if left(urlnaam,17) = 'file://localhost/' then do
          address command 'GetString "Local document - change URL for remote links" String "'urlnaam'" Var newurl Global'
          if RC = 0 then
            urlnaam = getvar('newurl')
          call deletevar('newurl')
        end

        nr = pos(urlnaam||ret,htmllist)
        if nr = 0 then
          call NewHTML
        else do
          startnr = lastpos(ret,htmllist,nr)+1
          saveto = substr(htmllist,startnr,nr-startnr-1)
          hit=hit+1
        end

      end
  end
end

if hit>0 then do
  if hit ~= 2 then
    saveto=cachedir'HTMLs/'saveto
  else
    do n=1 until ~exists(saveto)
      saveto='T:temphtml'n
    end
  nr = lastpos('/',urlnaam)
  urlstam = left(urlnaam,nr)
  nr = pos('/',urlstam,8)
  urlroot = left(urlstam,nr-1)

  address AMOSAIC.1 'fetch source'
  inhoud = result
  nr = max(pos('<html>',inhoud),pos('<HTML>',inhoud))
  if nr > 1 then
    inhoud = substr(inhoud,nr)
  call ChkLinks
  zkinhoud=''

  call ChkCache
  call open(4output,saveto,'W')
  call writech(4output,inhoud)
  call close(4output)
  inhoud=''

  address AMOSAIC.1 'jump url file://localhost/'saveto
  do i=1 for image.0
    if nieuw.i > 0 then
      address AMOSAIC.1 'fetch inline url file://localhost/'cachedir'Images/'nieuw.i
  end
  if hit=2 then
    call delete(saveto)

end
exit 0

NewHTML:
  nr = lastpos('/',urlnaam)
  bestand = substr(urlnaam,nr+1)
  address AMOSAIC.1 'fetch title'
  titel = result
  if bestand = '' then
    bestand=titel

  q=0
  do until q>0
    address command 'SetEnv filenaam `RequestFile 'dir' File "'bestand'" Title "Save HTML document as..." SaveMode`'
    bestand = getvar('filenaam')
    call deletevar('filenaam')
    if bestand = '' then
      q=1
    else do
      nr = lastpos('/',bestand)
      if left(bestand,nr) = dir then
        if ~exists(bestand) then
          q=2
    end
  end

  if q=2 then do
    saveto = substr(bestand,nr+1)
    hit=hit+1
    address command 'Echo >>'cachedir'HTMLlist "'saveto','urlnaam'"'
    htmllist=htmllist||saveto','urlnaam||ret
    address command 'Echo >>'cachedir'Cache.html "<A HREF=*"HTMLs/'saveto'*">'titel'</A><BR>"'

    zoek=urlnaam
    vervang='file://localhost/'dir||saveto
    call MultiFR
  end
return 0

RemHTML:
  type=0
  tekst=cachedir'HTMLs/'
  nr = pos(tekst,urlnaam)
  if nr > 0 then
    HTML = substr(urlnaam,nr+length(tekst))
  else
    HTML=urlnaam
  call WisItem

  type=1
  address AMOSAIC.1 'fetch images IMAGE'
  do i=1 for image.0
    if image.i.current then do
      tekst=cachedir'Images/'
      nr = pos(tekst,image.i.url)
      if nr > 0 then
        Image = substr(image.i.url,nr+length(tekst))
      else
        Image=image.i.url
      call WisItem
    end

  end
return 0

ChkLinks:
  delta=0
  zkinhoud = upper(inhoud)
  zoeknr = pos('HREF=',zkinhoud)
  do while zoeknr > 0

    nr = zoeknr-lastpos('<A',zkinhoud,zoeknr)-2
    zoeknr=zoeknr+5
    if nr=1 | nr=2 then do

      if substr(zkinhoud,zoeknr,1) = '"' then
        zoeknr=zoeknr+1
      else do
        inhoud = insert('"',inhoud,zoeknr+delta-1)
        delta=delta+1
      end
      stopnr = pos('>',zkinhoud,zoeknr)
      zklen=stopnr-zoeknr

      urlnaam = substr(zkinhoud,zoeknr,zklen)
      if pos(':',urlnaam) = 0 then
        call ReplUrl
      if right(urlnaam,1) ~= '"' then do
        inhoud = insert('"',inhoud,stopnr+delta-1)
        delta=delta+1
      end

     end
    else
      zklen=1

    zoeknr = pos('HREF=',zkinhoud,zoeknr+zklen)
  end

  delta=0
  zkinhoud = upper(inhoud) '"'
  zoeknr = pos('SRC=',zkinhoud)
  do while zoeknr > 0

    nr = substr(zkinhoud,zoeknr-1,1)
    zoeknr=zoeknr+4
    if nr=' ' | nr=ret then do 

      if substr(zkinhoud,zoeknr,1) = '"' then
        zoeknr=zoeknr+1
      else do
        inhoud = insert('"',inhoud,zoeknr+delta-1)
        delta=delta+1
      end
      stopnr = min(pos('"',zkinhoud,zoeknr),pos(' ',zkinhoud,zoeknr),pos(ret,zkinhoud,zoeknr))+1
      zklen=stopnr-zoeknr

      urlnaam = substr(zkinhoud,zoeknr,zklen)
      if pos('://',urlnaam) = 0 then
        call ReplUrl
      if right(urlnaam,1) ~= '"' then do
        inhoud = insert('"',inhoud,stopnr+delta-2)
        delta=delta+1
      end

     end
    else
      zklen=1

    zoeknr = pos('SRC=',zkinhoud,zoeknr+zklen)
  end

  delta=0
  zkinhoud = upper(inhoud)
  zoeknr = pos('ACTION="',zkinhoud)
  do while zoeknr > 0

    zoeknr=zoeknr+8
    stopnr = pos('"',zkinhoud,zoeknr)
    zklen=stopnr-zoeknr

    urlnaam = substr(zkinhoud,zoeknr,7)
    if urlnaam ~= 'HTTP://' then
      call ReplUrl

    zoeknr = pos('ACTION="',zkinhoud,zoeknr+zklen)
  end
return 0

ReplUrl:
  if left(urlnaam,1) ~= '#' then do
    if left(urlnaam,1) ~= '/' then
      tekst=urlstam
    else
      tekst=urlroot

    inhoud = insert(tekst,inhoud,zoeknr+delta-1)
    delta=delta+length(tekst)
  end
return 0

ChkCache:
  do i=1 for image.0
    if nieuw.i > 0 then do
      nr = pos(image.i.url'"',inhoud)
      inhoud = delstr(inhoud,nr,length(image.i.url))
      inhoud = insert('file://localhost/'cachedir'Images/'nieuw.i,inhoud,nr-1)
    end
  end

  if hit ~= 2 then do
    address AMOSAIC.1 'fetch links HREF'
    do i=1 for href.0
      nr = pos(href.i.url||ret,htmllist)
      if nr > 0 then do
        startnr = lastpos(ret,htmllist,nr)+1
        bestand = substr(htmllist,startnr,nr-startnr-1)

        nr = pos(href.i.url,inhoud)
        do while nr > 0
          zklen=length(href.i.url)
          tekst=substr(inhoud,nr+zklen,1)

          if tekst='#' | tekst='"' then do
            inhoud = delstr(inhoud,nr,zklen)
            inhoud = insert('file://localhost/'cachedir'HTMLs/'bestand,inhoud,nr-1)
          end

          nr = pos(href.i.url,inhoud,nr+zklen)
        end

      end
    end

  end
return 0

AllesWeg:
  address command
  'Echo >'cachedir'ImageList'
  'Echo >'cachedir'NrOfImage 0'
  'Delete 'cachedir'Images/#?'

  'Echo >'cachedir'HTMLlist'
  'Echo >'cachedir'Cache.html "<HTML><HEAD><TITLE>Available cached documents</TITLE></HEAD><BODY>"'
  'Delete 'cachedir'HTMLs/#?'
return 0

WisItem:
  if type then do
    nr = pos('://',Image)
    if nr > 0 then
      zoek=','Image||ret
    else
      zoek=ret||Image','
    listfile=cachedir'ImageList'
    dir=cachedir'Images/'

   end
  else do
    nr = pos('://',HTML)
    if nr > 0 then
      zoek=','HTML||ret
    else
      zoek=ret||HTML','
    listfile=cachedir'HTMLlist'
    dir=cachedir'HTMLs/'
  end

  call open(1input,listfile,'R')
  list = ret||readch(1input,65534)
  call close(1input)

  nr = pos(zoek,list)
  if nr = 0 then
    say zoek 'not found in' listfile
  else do
    startnr = lastpos(ret,list,nr)+1
    midnr = pos(',',list,startnr)
    stopnr = pos(ret,list,midnr)+1

    bestand = substr(list,startnr,midnr-startnr)
    urlnaam = substr(list,midnr+1,stopnr-midnr-2)
    call delete(dir||bestand)
    say dir||bestand 'with URL:' urlnaam 'deleted.'

    list = delstr(list,startnr,stopnr-startnr)
    call open(1output,listfile,'W')
    call writech(1output,substr(list,2))
    call close(1output)

    if ~type then do
      call open(5input,cachedir'Cache.html','R')
      list = readch(5input,65535)
      call close(5input)

      nr = pos('HTMLs/'bestand,list)
      startnr = lastpos(ret,list,nr)+1
      stopnr = pos(ret,list,nr)+1

      list = delstr(list,startnr,stopnr-startnr)
      call open(5output,cachedir'Cache.html','W')
      call writech(5output,list)
      call close(5output)
    end

    zoek='file://localhost/'dir||bestand
    vervang=urlnaam
    dir=cachedir'HTMLs/'
    call MultiFR
  end
return 0

MultiFR:
  files = showdir(dir,'FILES',',')
  if files = '' then
    return 0
  else
    files=files','

  startnr=1
  stopnr = pos(',',files)
  do until stopnr = 0
    bestand = substr(files,startnr,stopnr-startnr)

    call open(6input,dir||bestand,'R')
    inhoud = readch(6input,65535)
    call close(6input)

    q=0
    nr = pos(zoek,inhoud)
    do while nr > 0
      zklen=length(zoek)
      tekst=substr(inhoud,nr+zklen,1)

      if tekst='#' | tekst='"' then do
        q=1
        inhoud = delstr(inhoud,nr,zklen)
        inhoud = insert(vervang,inhoud,nr-1)
        zklen=length(vervang)
      end

      nr = pos(zoek,inhoud,nr+zklen)
    end

    if q then do
      call open(6output,dir||bestand,'W')
      call writech(6output,inhoud)
      call close(6output)
      say dir||bestand 'updated.'
    end

    startnr=stopnr+1
    stopnr = pos(',',files,startnr)
  end
  inhoud=''
return 0

