#include <windows.h>
#include <stdio.h>
#include "drvload.h"

void PrintUsage(char *exe)
{
    printf ("%s [-name WinDriver] [-file WINDRVR] [create|start|stop|delete|install|remove]\n", exe);
    printf ("\n");
    printf ("example: To load a driver called MPEG Encoder, with file names MPEGENC.VXD and\n");
    printf ("         MPEGENC.SYS:\n");
    printf ("         WDREG -name \"MPEG Encoder\" -file MPEGENC create start\n");
    printf ("         is the same as:\n");
    printf ("         WDREG -name \"MPEG Encoder\" -file MPEGENC install\n");
    printf ("\n");
    printf ("example: To unload default driver (i.e. WinDriver), and remove it from registry:\n");
    printf ("         WDREG stop delete\n");
    printf ("         is the same as:\n");
    printf ("         WDREG remove\n");
}

int main (int argc, char *argv[])
{
    char *sDriverName = NULL;
    char *sDriverFile = NULL;
    int i;
    if (argc==1)
    {
        PrintUsage(argv[0]);
        return 0;
    }       

    for (i=1; i<argc; i++)
    {
        if (argv[i][0]=='-')
        {
            if (stricmp(argv[i],"-name")==0)
            {
                i ++;
                if (i==argc)
                {
                    printf ("option '-name' needs a following argument\n");
                    return 1;
                }
                sDriverName = argv[i];
            }
            else if (stricmp(argv[i],"-file")==0)
            {
                i ++;
                if (i==argc)
                {
                    printf ("option '-file' needs a following argument\n");
                    return 1;
                }
                sDriverFile = argv[i];
            }
            else
            {
                printf ("unknown option %s\n",argv[i]);
                return 1;
            }
        }
        else break;
    }
    if (!sDriverName && !sDriverFile)
    {
        sDriverName = "WinDriver";
        sDriverFile = "WINDRVR";
    }
    else if (!sDriverName)
    {
        sDriverName = sDriverFile;
    }
    else if (!sDriverFile)
    {
        sDriverFile = sDriverName;
    }

    int rc = 0;
    LoadDriver *loadDriver = NewLoadDriver ();
    if (!loadDriver)
    {
        printf ("This program can run only on Win95/Win98/WinNT");
        rc = 1;
        goto Exit;
    }
    if (loadDriver->HasMsg())
        printf ("%s", loadDriver->GetLastMsg());
    if (loadDriver->HasErr())
    {
        rc = 1;
        goto Exit;
    }

    loadDriver->Init(sDriverName, sDriverFile);

    if (i==argc)
    {
        printf ("nothing to do!\n");
        rc = 0;
        goto Exit;
    }

    for (; i<argc; i++)
    {
        if (stricmp(argv[i],"create")==0)
        {
            printf ("Creating driver entry... ");
            if (!loadDriver->Create())
            {
                printf ("Failed\n");
                printf ("%s", loadDriver->GetLastMsg());
            }
            else printf ("OK\n");
        }
        else if (stricmp(argv[i],"delete")==0)
        {
            printf ("Deleting driver entry... ");
            if (!loadDriver->Delete())
            {
                printf ("Failed\n");
                printf ("%s", loadDriver->GetLastMsg());
            }
            else printf ("OK\n");
        }
        else if (stricmp(argv[i],"start")==0)
        {
            printf ("Starting driver... ");
            if (!loadDriver->Start())
            {
                printf ("Failed\n");
                printf ("%s", loadDriver->GetLastMsg());
            }
            else printf ("OK\n");
        }
        else if (stricmp(argv[i],"stop")==0)
        {
            printf ("Stopping driver... ");
            if (!loadDriver->Stop())
            {
                printf ("Failed\n");
                printf ("%s", loadDriver->GetLastMsg());
            }
            else printf ("OK\n");
        }
        else if (stricmp(argv[i],"install")==0)
        {
            printf ("Creating driver entry... ");
            if (!loadDriver->Create())
            {
                printf ("Failed\n");
                printf ("%s", loadDriver->GetLastMsg());
            }
            else printf ("OK\n");
            printf ("Starting driver entry... ");
            if (!loadDriver->Start())
            {
                printf ("Failed\n");
                printf ("%s", loadDriver->GetLastMsg());
            }
            else printf ("OK\n");
        }
        else if (stricmp(argv[i],"remove")==0)
        {
            printf ("Stopping driver entry... ");
            if (!loadDriver->Stop())
            {
                printf ("Failed\n");
                printf ("%s", loadDriver->GetLastMsg());
            }
            else printf ("OK\n");
            printf ("Deleting driver entry... ");
            if (!loadDriver->Delete())
            {
                printf ("Failed\n");
                printf ("%s", loadDriver->GetLastMsg());
            }
            else printf ("OK\n");
        }
        else
        {
            printf ("unknown option %s\n",argv[i]);
            return 1;
        }
    }

Exit:
    delete loadDriver;

    return rc;
}