/**************************************************************************/
/*                                                                        */
/*  Multitool II   -   DOS-Hilfsprogramm                Version 1.3r000   */
/*                                                                        */
/*  ©1992 Boris Jakubaschk                                                */
/*                                                                        */
/*  Modul 5 - DevsStat: Devs und Status einlesen und anzeigen             */
/*                                                                        */
/**************************************************************************/

#include "MToolDefs.h"

/* Datenbereich für Device-Liste */

struct Node DL_Nodes[ DL_NODMAX ];
struct MinList DL_List;
char DL_Strings[ DL_STRLEN ];
ULONG DL_StrEntry = 0l;
ULONG DL_NumEntry = 0l;

void SPrintGroup( char *Dest, ULONG Val, char Len )
    {
    char Dummy[20];
    char len2, len3;
    int i;

    strncpy( Dest, ".........................", Len );
    sprintf( Dummy, "%d", Val );
    len2 = strlen( Dummy );
    len3 = (((len2-1) * 4) / 3) + 1;
    for (i=1; i<=len2; i++) Dest[len3 - (((len2-i)*4)/3)-1] = Dummy[i-1];
    Dest[len3] = '\0';
    }


/* ShowStat: Ausgabe der Deviceinformationen am unteren Bildschirmrand.
    Act      0=linkes, 1=rechtes Dateienfenster */

void ShowStat( char Act )
    {
    char   Dummy[80];
    char   Dummy1[15], Dummy2[15];
    LONG   a, b;
    short  y2;

    a = AvailMem( MEMF_CHIP );
    b = AvailMem( MEMF_FAST );
    SPrintGroup( Dummy1, a, 14 );
    SPrintGroup( Dummy2, b, 14 );
    sprintf( STitle, LS[MSG_5_T_Title], Dummy1, Dummy2 );
    SetWindowTitles( Wnd, (char *)-1, STitle );

    if ( (VL_OldAct!=VL_Active && VL_Archiv!=~0) || VL_OldArc!=VL_Archiv )
        {
        if (VL_Archiv==VL_Active)
            {
            GT_SetGadgetAttrs(Gadgets[7], Wnd, 0, GA_Disabled, TRUE, TAG_DONE);
            GT_SetGadgetAttrs(Gadgets[8], Wnd, 0, GA_Disabled, TRUE, TAG_DONE);
            GT_SetGadgetAttrs(Gadgets[12], Wnd, 0, GA_Disabled, TRUE, TAG_DONE);
            GT_SetGadgetAttrs(Gadgets[13], Wnd, 0, GA_Disabled, TRUE, TAG_DONE);
            GT_SetGadgetAttrs(Gadgets[14], Wnd, 0, GA_Disabled, TRUE, TAG_DONE);
            }
        else if (VL_Archiv!=~0)
            {
            GT_SetGadgetAttrs(Gadgets[7], Wnd, 0, GA_Disabled, FALSE, TAG_DONE);
            GT_SetGadgetAttrs(Gadgets[8], Wnd, 0, GA_Disabled, FALSE, TAG_DONE);
            GT_SetGadgetAttrs(Gadgets[12], Wnd, 0, GA_Disabled, TRUE, TAG_DONE);
            GT_SetGadgetAttrs(Gadgets[13], Wnd, 0, GA_Disabled, FALSE, TAG_DONE);
            GT_SetGadgetAttrs(Gadgets[14], Wnd, 0, GA_Disabled, FALSE, TAG_DONE);
            }
        else
            {
            GT_SetGadgetAttrs(Gadgets[7], Wnd, 0, GA_Disabled, FALSE, TAG_DONE);
            GT_SetGadgetAttrs(Gadgets[8], Wnd, 0, GA_Disabled, FALSE, TAG_DONE);
            GT_SetGadgetAttrs(Gadgets[12], Wnd, 0, GA_Disabled, FALSE, TAG_DONE);
            GT_SetGadgetAttrs(Gadgets[13], Wnd, 0, GA_Disabled, FALSE, TAG_DONE);
            GT_SetGadgetAttrs(Gadgets[14], Wnd, 0, GA_Disabled, FALSE, TAG_DONE);
            };
        };

    VL_OldArc = VL_Archiv;
    VL_OldAct = VL_Active;

    if (VL_Valid[Act])
        {
        SetAPen( Wnd->RPort, (Act==VL_Active) ? 2 : 3 );
        SPrintGroup( Dummy1, VL_StatFree[Act], 14 );
        sprintf(Dummy, LS[MSG_5_T_Stat], Dummy1, VL_StatStat[Act]);
        Move( Wnd->RPort, LY_LXOffset[Act]+4, LY_YTOffset );
        Text( Wnd->RPort, Dummy, (LY_LNumChars>29) ? 29 : LY_LNumChars );
        }
    else
        {
        SetAPen( Wnd->RPort, (Act==VL_Active) ? 2 : 3 );
        Move( Wnd->RPort, LY_LXOffset[Act]+4, LY_YTOffset );
        Text( Wnd->RPort, LS[MSG_5_T_NotValid], (LY_LNumChars>29) ? 29 : LY_LNumChars );
        };

    if (WindowTags[ 3 ].ti_Data>=400)
        {
        y2 = WindowTags[ 3 ].ti_Data - LY_LFontH - 20;
        }
    else
        {
        y2 = WindowTags[ 3 ].ti_Data - LY_LFontH - 14;
        };
    if (VL_Active==0)
        {
        DrawBevelBox( Wnd->RPort, 5, LY_TopList, LY_LXS, y2-LY_TopList, GT_VisualInfo, VisualInfo, GTBB_Recessed, TRUE, TAG_DONE );
        DrawBevelBox( Wnd->RPort, WindowTags[ 2 ].ti_Data-((CustomScreen)?0:16)-5-LY_LXS, LY_TopList, LY_LXS, y2-LY_TopList, GT_VisualInfo, VisualInfo, TAG_DONE );
        }
    else
        {
        DrawBevelBox( Wnd->RPort, 5, LY_TopList, LY_LXS, y2-LY_TopList, GT_VisualInfo, VisualInfo, TAG_DONE );
        DrawBevelBox( Wnd->RPort, WindowTags[ 2 ].ti_Data-((CustomScreen)?0:16)-5-LY_LXS, LY_TopList, LY_LXS, y2-LY_TopList, GT_VisualInfo, VisualInfo, GTBB_Recessed, TRUE, TAG_DONE );
        }
    }

void GetStat( char Act )
    {
    char   *c;
    struct InfoData *IData;
    struct FileLock *FL;

    c = VL_Name[Act];

    if ((FL=(struct FileLock *)Lock(c,ACCESS_READ))!=0)
        {
        VL_Valid[Act]=255;
        IData = (struct InfoData *)AllocMem(sizeof(struct InfoData), 0);
        if (Info((BPTR)FL,IData))
            {
            VL_StatFree[Act]=(IData->id_NumBlocks - IData->id_NumBlocksUsed) * IData->id_BytesPerBlock;
            switch (IData->id_DiskState)
               {
               case ID_WRITE_PROTECTED: VL_StatStat[Act]="PROT.";
                                        break;
               case ID_VALIDATING     : VL_StatStat[Act]="VDAT.";
                                        break;
               default                : VL_StatStat[Act]=" OK  ";
               }
            }
        else
            {
            exit(20);
            };
        FreeMem(IData,sizeof(struct InfoData));
        UnLock((BPTR)FL);
        }
    else
        {
        VL_Valid[Act]=0;
        };
    ShowStat( Act );
    }


/* AddAlpha : interne Funktion von GetDevs; ordnet Node in NodeList alpha-
              betisch ein.
    LI        Zeiger auf Listenkopf
    NO        Zeiger auf einzufügende Node */

void AddAlpha( struct MinList *LI, struct Node *NO, ULONG Skip )
    {
    struct Node *NP;
    ULONG i;

    NP=LI->mlh_Head;

    for (i=0; i<Skip & NP->ln_Succ!=0; i++) NP=NP->ln_Succ;

    if (NP->ln_Succ==0)
        {
        AddTail(LI,NO);
        }
    else
        {
        while ( NP->ln_Succ!=0 && strcmp(NP->ln_Name, NO->ln_Name)<0 )
            NP=NP->ln_Succ;
        NO->ln_Succ = NP->ln_Pred->ln_Succ;
        NO->ln_Pred = NP->ln_Pred;
        NP->ln_Pred->ln_Succ = NO;
        NP->ln_Pred = NO;
        };
    }


/* GetDevs   : Liest Informationen zu den angemeldeten Geräten, deren Namen
               und den "Assign"ten Gerätenamen ein und legt diese in einer
               alphabetisch sortierten Liste zur Verwendung in einem List-
               view-Gadget an.
   Keine Übergabeparameter, es werden folgende globale Variablen verwendet:
    DL_List       Zeiger auf die obengenannte Liste
    DL_StrEntry   Anzahl Zeichen in DL_Strings
    DL_NumEntry   Anzahl Einträge in Liste
    DL_Strings    String, der die Namen enthält: "Name1\0Name2\0Name3\0..." */


void GetDevs( void )
    {
    int i, j, devnum;
    char *Add;
    ULONG Skip = 0;
    struct DosList *List, *DosList;
    struct FileLock *FL;

    DL_List.mlh_Head = (struct Node *)&DL_List.mlh_Tail;
    DL_List.mlh_Tail = (struct Node *)0l;
    DL_List.mlh_TailPred = (struct Node *)&DL_List.mlh_Head;
    DL_StrEntry = 0l;
    DL_NumEntry = 0l;

    List = (struct DosList *)LockDosList(LDF_READ|LDF_ALL);
    i = 0;
    do
        {
        DosList = List;
        while ( DosList = (struct DosList *)NextDosEntry(DosList, LDF_ALL) )
            {
            if (DosList->dol_Type == i && DL_StrEntry<DL_STRLEN-30 && DL_NumEntry<DL_NODMAX )
                {
                Add = (char*)BADDR(DosList->dol_Name);
                for(j=1; j<=Add[0]; j++)
                    DL_Strings[DL_StrEntry+j-1] = Add[j];
                DL_Strings[DL_StrEntry+j-1] = ':';
                DL_Strings[DL_StrEntry+j] = 0;
                if (DosList->dol_Task)
                    {
                    DL_Nodes[DL_NumEntry].ln_Name = &DL_Strings[DL_StrEntry];
                    AddAlpha( &DL_List, &DL_Nodes[DL_NumEntry], Skip );
                    DL_StrEntry = DL_StrEntry+j+1;
                    DL_NumEntry++;
                    };
                };
            };
        Skip = DL_NumEntry;
        if (i==1) i=3;
        if (i==2) i=1;
        if (i==0)
            {
            i=2;
            devnum = DL_NumEntry;
            };
        }
    while (i!=3);
    UnLockDosList(LDF_READ|LDF_ALL);

    for (i = 0; i<devnum; i++)
         if (FL=(struct FileLock *)Lock(DL_Nodes[i].ln_Name, ACCESS_READ))
             {
             UnLock( (BPTR)FL );
             }
         else Remove( &DL_Nodes[i] );
    }

