#ifndef XPKMASTER_PROGRESS_C
#define XPKMASTER_PROGRESS_C

/* Routinesheader

	Name:		progress.c
	Main:		xpkmaster
	Versionstring:	$VER: progress.c 1.0 (06.10.96)
	Author:		SDI
	Distribution:	PD
	Description:	Progress report handler

 1.0   06.10.96 : first real version
*/

#include <exec/types.h>
#include <pragma/intuition_lib.h>
#include "xpkmaster.h"

LONG callprogress(struct XpkBuffer *xbuf)
{
  struct XpkProgress *prog = &xbuf->xb_Prog;

  if(!xbuf->xb_ChunkHook)
    return 0;

  if(prog->xp_ULen)
  {
    ULONG secs, mics, time, freq;

    /* ToDo: Test for >=V36 and use ReadEClock */
    CurrentTime(&secs, &mics);
    freq = 128;
/*  time = (secs - xbuf->xb_Secs)*freq + mics/(1000000/freq) - xbuf->xb_Mics/(1000000/freq); */
    time = (secs - xbuf->xb_Secs)*freq + (mics+1000000-xbuf->xb_Mics)/(1000000/freq) - freq;

    if (prog->xp_UCur < 30000000)
      prog->xp_Speed = (freq * prog->xp_UCur) / (time + 1);
    else
      prog->xp_Speed = prog->xp_UCur / (time/freq + 1);

    prog->xp_Done = prog->xp_ULen ? 100 * prog->xp_UCur/prog->xp_ULen : 100;
    if(prog->xp_UCur > 20)
      if((prog->xp_CF = 100 - 100 * prog->xp_CCur / prog->xp_UCur) < 0)
	prog->xp_CF = 0;
  }
  else
    prog->xp_Speed = 0;

  if(MyCallHookPkt(xbuf->xb_ChunkHook, prog A4SUPP2))
    xbuf->xb_Result = XPKERR_ABORTED;

  return xbuf->xb_Result;
}

#endif /* XPKMASTER_PROGRESS_C */
