/*
   ***************************************************************************
   *
   * Datei:
   *      RSysDisplays.c
   *
   * Inhalt:
   *
   *      --- Globale Routinen ---
   *
   *    int DisplayDiskInfo ( char *filename , int with_tree );
   *    int DisplayFileInfo ( char *filename );
   *    int DisplayFontInfo ( RSYS_Objid *obj );
   *    int DisplayLibraryInfo ( RSYS_Objid *obj );
   *    int DisplayLockInfo ( RSYS_Objid *obj );
   *    int DisplayPortInfo ( RSYS_Objid *obj );
   *    int DisplayScreenInfo ( RSYS_Objid *obj );
   *    int DisplayTaskInfo ( RSYS_Objid *obj );
   *    int DisplayWindowInfo ( RSYS_Objid *obj );
   *    void DisplayDirectoryInfo ( char *filename );
   *    void DisplayResourceInfo ( RSYS_Objid *obj );
   *    void DisplaySoftDevInfo ( RSYS_Objid *obj );
   *
   *      --- Lokale  Routinen ---
   *
   *    static char *makelibflags ( LIBRARY *lib , char *flags );
   *    static void savecpyid ( char *IDStr , LIBRARY *lib );
   *
   * Bemerkungen:
   *      Funktionen zur Anzeige weiterer Informationen zu ausgewählten
   *      Objekten.
   *
   * Erstellungsdatum:
   *      07-Jul-93     Rolf Böhme
   *
   * Änderungen:
   *      07-Jul-93     Rolf Böhme        Erstellung
   *
   *
   * NOTE: all funcs calling MyEasyRequest() rewritten to sprintf
   *            buffer locally for ease of examination.
   *
   *
   ***************************************************************************
 */

#include "RSys.h"
#include "protos.h"

 /*
  * DisplayDiskInfo() zeigt eine Info über ein Volume an.
  * Auf Wunsch kann die Verzeichnisstruktur angezeigt
  * werden
  */
int
DisplayDiskInfo (char *filename, int with_tree)
{
  int sel;
  long free = 0L, used = 0L, percentused = 0L;
  char state[50], type[60];

  char xxxx[1000];

  DPOS;

  FreeBytes (filename, &free, &used, &percentused, state, type);

  sprintf (xxxx,
	   (UBYTE *) "Name    : %-20.20s\n"
	   "Size    : %7ld KBytes\n"
	   "Free    : %7ld KBytes\n"
	   "Used    : %7ld KBytes\n"
	   "%%%% used  : %3ld%%%%\n"
	   "State   : %s\n"
	   "Type    : %s",

	   filename,
	   free + used,
	   free,
	   used,
	   percentused,
	   state,
	   type);

  sel = MyEasyRequest (SysWnd, (UBYTE *) NAME " - Volume/Device Info",
		     (UBYTE *) ((with_tree) ? "Tree|Continue" : "Continue"),
		       xxxx);
  return sel;
}

 /*
  * DisplayFileInfo() zeigt Infos über eine Datei an.
  * Handelt es sich um ein Executable, kann eine Hunk-Liste
  * erzeugt werden lassen
  */
int
DisplayFileInfo (char *filename)
{
  char path[MAXFULLNAME], *help, file[MAXFULLNAME];
  int ftype = filetype (filename);
  int sel;

  char xxxx[1000];

  DPOS;

  strncpy (path, filename, MAXFULLNAME);
  help = (char *) PathPart ((UBYTE *) path);
  *help = STRINGEND;

  strncpy (file, (char *) FilePart ((UBYTE *) filename), MAXFULLNAME);

  sprintf (xxxx,
	   (UBYTE *) "Filename : %-20.20s\n"
	   "Path     : %s\n"
	   "Size     : %ld Bytes\n"
	   "Type     : %s",

	   file,
	   path,
	   SizeOfFile (filename),
	   mess[ftype]);

  sel = MyEasyRequest (NULL, (UBYTE *) NAME " - File Info",
		       (UBYTE *) ((ftype == TYPE_EXECUTABLE) ?
				  "Hunk list|Continue" : "Continue"),
		       xxxx);

  if (ftype != TYPE_EXECUTABLE)
    return TRUE;

  return sel;
}

 /*
  * DisplayDirectoryInfo() zeigt Infos über ein Verzeichnis
  * an
  */
void
DisplayDirectoryInfo (char *filename)
{
  int count, Dirs = 0;
  long Size = 0L;
  char path[MAXFULLNAME], *help;
  BPTR lock;

  char xxxx[1000];

  DPOS;

  strncpy (path, filename, MAXFULLNAME);
  help = (char *) PathPart ((UBYTE *) path);
  *help = STRINGEND;

  if (lock = Lock ((UBYTE *) path, MODE_OLDFILE))
    {
      count = SizeOfDir (lock, &Size, &Dirs);
      UnLock (lock);
    }
  else
    {
      count = Size = Dirs = 0;
    }

  sprintf (xxxx,
	   (UBYTE *) "Path       : %s\n"
	   "# Files    : %ld\n"
	   "# Sub-Dirs : %ld\n"
	   "Total      : %ld Bytes",
	   path, count, Dirs, Size);

  MyEasyRequest (NULL,
		 (UBYTE *) NAME " - Directory Info", (UBYTE *) "Continue",
		 xxxx);

  return;
}

 /*
  * DisplayTaskInfo() zeigt Infos über einen Task an. Auf
  * Wunsch kann der Task gekillt, ein Signal gesendet oder
  * die Priorität geändert werden
  */
int
DisplayTaskInfo (RSYS_Objid * obj)
{
  TASK *task = (TASK *) obj->address, display_task;
  char *status[] =
  {
    "Invalid", "Adding ", "Running", "Ready ", "Waiting", "Except", "Remove"
  };
  int sel = 7, wins = 0, scrs = 0, ports = 0;

  char xxxx[1000];

  DPOS;

  Disable ();
  CopyMem (task, &display_task, sizeof (TASK));
  Enable ();

  CountAssocObjects (task, &wins, &scrs, &ports);

  sprintf (xxxx,
	   "Name      : %-20.20s  (%s) Prio: %-4ld\n"
	   "Address   : 0x%08X  Flags     : 0x%08X\n"
	   "State     : %-8s    IDNest    : %-8ld\n"
	   "TDNest    : %-8ld    SigAlloc  : 0x%08X\n"
	   "SigWait   : 0x%08X  SigRecvd  : 0x%08X\n"
	   "SigExcept : 0x%08X  Stack     : %-5ld\n\n"
	   "Associated Objects\n"
	   "Ports     : %4ld - Windows : %4ld\n"
	   "Screens   : %4ld",

	   obj->fullname,
	   (display_task.tc_Node.ln_Type == NT_TASK) ? "Task" : "Process",
	   display_task.tc_Node.ln_Pri,
	   task,
	   display_task.tc_Flags,
	   status[display_task.tc_State],
	   display_task.tc_IDNestCnt,
	   display_task.tc_TDNestCnt,
	   display_task.tc_SigAlloc,
	   display_task.tc_SigWait,
	   display_task.tc_SigRecvd,
	   display_task.tc_SigExcept,
	((ULONG) display_task.tc_SPUpper - (ULONG) display_task.tc_SPLower),
	   ports,
	   wins,
	   scrs);

  sel = MyEasyRequest (SysWnd, get_vers (" - Task Control"),
		       "Kill!|^C|^D|^E|^F|Prio|Continue",
		       xxxx);
  return sel;
}

 /*
  * savecpyid() kopiert den ID-String einer Library in ein
  * Zeichenfeld. Am Ende des Strings erscheinen häufig zwei
  * Sonderzeichen, die hier entfernt werden
  *
  *
  * hacked by GMD
  *
  */
static void
savecpyid (char *IDStr, LIBRARY * lib)
{
  char *id = (char *) lib->lib_IdString;
  int j;


  for (j = 0; j < 40; ++j)
    {
      IDStr[j] = '\0';
    }

  if (id && *id)
    {
      for (j = 0; (j < 40) && (*id); ++j)	/* remove CR/LF */
	{
	  if ((*id == '\n') || (*id == '\r'))
	    IDStr[j] = '\0';
	  else
	    IDStr[j] = *id++;
	}

    }
  else
    strcpy (IDStr, field[NO_LIB_ID]);

  return;
}

 /*
  * makelibflags() erzeugt entsprechend der Library-Flags
  * einen "lesbaren" String
  */
static char *
makelibflags (LIBRARY * lib, char *flags)
{

  if (lib->lib_Flags == 0)
    strcpy (flags, field[NO_FLAGS]);
  else
    sprintf (flags, "%10s %10s %10s %10s",
	(lib->lib_Flags & LIBF_SUMUSED) ? "ResetByErr" : field[BLANK_FIELD],
	  (lib->lib_Flags & LIBF_SUMMING) ? "CheckSum" : field[BLANK_FIELD],
	   (lib->lib_Flags & LIBF_CHANGED) ? "Changed" : field[BLANK_FIELD],
	(lib->lib_Flags & LIBF_DELEXP) ? "DelExpunge" : field[BLANK_FIELD]);

  return flags;
}

 /*
  * DisplayLibraryInfo() zeigt alle Infos über eine Library
  * an
  */
int
DisplayLibraryInfo (RSYS_Objid * obj)
{
  int sel;
  LIBRARY *lib = (LIBRARY *) obj->address;
  char IDStr[100];
  char xflags[100];

  char xxx[1000];

  makelibflags (lib, xflags);

  DPOS;

  savecpyid (IDStr, lib);

  sprintf (xxx,
	   "Type           : Library\n"
	   "Name           : %s\n"
	   "ID-String      : %-30.30s\n"
	   "Address        : 0x%08X\n"
	   "Flags          : %s\n"
	   "Jump-Table-Size: %4ld Bytes   Data-Size   : %ld Bytes\n"
	   "CheckSum       : 0x%08X",

	   obj->fullname,
	   IDStr,
	   obj->address,
	   xflags,
	   lib->lib_NegSize,
	   lib->lib_PosSize,
	   lib->lib_Sum
    );

  sel = MyEasyRequest (SysWnd, get_vers (" - Library Control"),
		       "Remove Library|Continue",
		       xxx
    );

  return sel;
}

 /*
  * DisplaySoftDevInfo() zeigt alle Infos über ein
  * *.device an
  */
void
DisplaySoftDevInfo (RSYS_Objid * obj)
{
  LIBRARY *lib = (LIBRARY *) obj->address;
  char IDStr[100];
  char xflags[100];

  char xxxx[1000];

  makelibflags (lib, xflags);

  DPOS;

  savecpyid (IDStr, lib);

  sprintf (xxxx,
	   "Type           : Software Device\n"
	   "Name           : %s\n"
	   "ID-String      : %-30.30s\n"
	   "Address        : 0x%08X\n"
	   "Flags          : %s\n"
	   "Jump-Table-Size: %4ld Bytes   Data-Size   : %ld Bytes\n"
	   "CheckSum       : 0x%08X",

	   obj->fullname,
	   IDStr,
	   obj->address,
	   xflags,
	   lib->lib_NegSize,
	   lib->lib_PosSize,
	   lib->lib_Sum);

  MyEasyRequest (SysWnd,
		 get_vers (" - Software Device Info"),
		 "Continue",
		 xxxx);

  return;
}

 /*
  * DisplayResourceInfo() zeigt alle Infos über eine .resource
  * an
  */
void
DisplayResourceInfo (RSYS_Objid * obj)
{
  LIBRARY *lib = (LIBRARY *) obj->address;
  char xflags[100];

  char xxxx[1000];

  makelibflags (lib, xflags);

  DPOS;

  sprintf (xxxx,
	   (UBYTE *) "Type           : Resource\n"
	   "Name           : %s\n"
	   "Address        : 0x%08X\n"
	   "Flags          : %s\n"
	   "Jump-Table-Size: %4ld Bytes   Data-Size   : %ld Bytes\n"
	   "CheckSum       : 0x%08X",

	   obj->fullname,
	   obj->address,
	   xflags,
	   lib->lib_NegSize,
	   lib->lib_PosSize,
	   lib->lib_Sum);

  MyEasyRequest (SysWnd,
		 get_vers (" - ResourceInfo"),
		 (UBYTE *) "Continue",
		 xxxx);
  return;
}

 /*
  * DisplayPortInfo() zeigt Infos über einen Port an
  */
int
DisplayPortInfo (RSYS_Objid * obj)
{
  int sel;
  MSGPORT *port;
  char sigtask[MAXFULLNAME];
  TASK *task;
  char *yflags[] =
  {
    "Signal", "SoftInt", "Ignore"
  };

  char xxxx[1000];

  DPOS;

  Disable ();
  port = (MSGPORT *) obj->address;
  if (port->mp_SigTask)
    {
      task = (TASK *) (port->mp_SigTask);
      savestrcpy (sigtask, &task->tc_Node, MAXFULLNAME, NT_TASK);
    }
  else
    strcpy (sigtask, field[NO_TASK]);

  Enable ();

  sprintf (xxxx,
	   (UBYTE *) "Type        : %s\n"
	   "Address     : 0x%08X\n"
	   "Name        : %-20.20s\n"
	   "Signal-Task : %-20.20s\n"
	   "Flags       : %s",

	   "Port",
	   obj->address,
	   obj->fullname,
	   sigtask,
	   yflags[port->mp_Flags]);

  sel = MyEasyRequest (SysWnd, get_vers (" - Port Control"),
		       (UBYTE *) "Remove Port|Continue",
		       xxxx);

  return sel;
}

 /*
  * DisplayFontInfo() zeigt alle Infos über einen Font an.
  * Dieser kann dann wahlweise entfernt oder angezeigt
  * werden
  */
int
DisplayFontInfo (RSYS_Objid * obj)
{
  int sel;

  char xxxx[1000];

  DPOS;

  sprintf (xxxx,
	   (UBYTE *) "Type    : %s\n"
	   "Address : 0x%08X\n"
	   "Name    : %s",

	   "Font",
	   obj->address,
	   obj->fullname);

  sel = MyEasyRequest (SysWnd, get_vers (" - Font Control"),
		       (UBYTE *) "Remove Font|Show Font|Continue",
		       xxxx);
  return sel;
}

 /*
  * DisplayWindowInfo() zeigt Infos über ein Fenster an
  */
int
DisplayWindowInfo (RSYS_Objid * obj)
{
  int sel;
  WINDOW disp_win;
  ULONG lock;

  char xxxx[1000];

  DPOS;

  lock = LockIBase (NULL);
  CopyMem ((WINDOW *) (obj->address), &disp_win, sizeof (WINDOW));
  UnlockIBase (lock);

  sprintf (xxxx,
	   (UBYTE *)
	   "Type     : Window   Address : 0x%08X\n"
	   "Name     : %-30.30s\n"
	   "Next     : 0x%08X\n"
	   "LeftEdge : %-4ld        TopEdge  : %-4ld\n"
	   "Width    : %-4ld        Height   : %-4ld\n"
	   "MinWidth : %-4ld        MinHeight: %-4ld\n"
	   "MaxWidth : %-4ld        MaxHeight: %-4ld\n"
	   "Flags    : 0x%08X  Menu: %s\n"
	   "Requester: %3s         ReqCount: %ld  DMReq: %s\n"
	   "IDCMP    : 0x%08X  Detail: %-2ld   Block: %2ld",

	   obj->address, obj->fullname,
	   disp_win.NextWindow,
	   disp_win.LeftEdge, disp_win.TopEdge,
	   disp_win.Width, disp_win.Height,
	   disp_win.MinWidth, disp_win.MinHeight,
	   disp_win.MaxWidth, disp_win.MaxHeight,
	   disp_win.Flags, (disp_win.MenuStrip ? "Yes" : "No"),
	   (disp_win.FirstRequest ? "Yes" : "No"), disp_win.ReqCount,
	   (disp_win.DMRequest ? "Yes" : "No"), disp_win.IDCMPFlags,
	   disp_win.DetailPen, disp_win.BlockPen);

  sel = MyEasyRequest (SysWnd,
		       get_vers (" - Window Control"),
		       (UBYTE *) "Close Window|Continue",
		       xxxx);

  return sel;
}

 /*
  * DisplayScreenInfo() zeigt Infos über ein Screen an
  */
int
DisplayScreenInfo (RSYS_Objid * obj)
{
  int sel;
  SCREEN disp_scr;
  ULONG lock;

  char xxxx[1000];

  DPOS;

  lock = LockIBase (NULL);
  CopyMem ((SCREEN *) (obj->address), &disp_scr, sizeof (SCREEN));
  UnlockIBase (lock);

  sprintf (xxxx,
	   (UBYTE *) "Type     : Screen   Address : 0x%08X\n"
	   "Name     : %.20s\n"
	   "Next     : 0x%08X\n"
	   "LeftEdge : %-4ld  TopEdge  : %-4ld\n"
	   "Width    : %-4ld  Height   : %-4ld\n"
	   "BarHeight: %-4ld  BarVBord : %-4ld\n"
	   "BarHBord : %-4ld  MenuVBord: %-4ld\n"
	   "MenuHBord: %-4ld  WBorTop  : %-4ld\n"
	   "WBorLeft : %-4ld  WBorRight: %-4ld\n"
	   "WBorBott : %-4ld  DetailPen: %-4ld\n"
	   "BlockPen : %-4ld  FlashCol : %-4ld\n"
	   "Flags    : 0x%08X",
	   obj->address, obj->fullname,
	   disp_scr.NextScreen,
	   disp_scr.LeftEdge, disp_scr.TopEdge,
	   disp_scr.Width, disp_scr.Height,
	   disp_scr.BarHeight, disp_scr.BarVBorder,
	   disp_scr.BarHBorder, disp_scr.MenuVBorder,
	   disp_scr.MenuHBorder, disp_scr.WBorTop,
	   disp_scr.WBorLeft, disp_scr.WBorRight,
	   disp_scr.WBorBottom, disp_scr.DetailPen,
	   disp_scr.BlockPen, disp_scr.SaveColor0,
	   disp_scr.Flags);

  sel = MyEasyRequest (SysWnd, get_vers (" - Screen Control"),
		       (UBYTE *) "Close Screen|Continue",
		       xxxx);
  return sel;
}

int
DisplayLockInfo (RSYS_Objid * obj)
{
  int sel;
  int ftype = filetype (obj->fullname);

  char xxxx[1000];

  sprintf (xxxx,
	   (UBYTE *) "Type      : Lock\n"
	   "File      : %s\n"
	   "Address   : 0x%08X\n"
	   "File type : %s",

	   obj->fullname,
	   obj->address,
	   mess[ftype]);

  sel = MyEasyRequest (SysWnd, get_vers (" - FileLock Control"),
		       (UBYTE *) (ftype ? "Unlock|Continue" : "Continue"),
		       xxxx);

  return (ftype ? sel : 0);
}
