;/* DWTwin v2.0  - Mark Weller (c)1998
;   Execute Twin Express using command files from DIRWORK 2.1 or CLI
;
;   Needs TwinExpress & [DIRWORK 2.1 or used in a script]
;
;   execute this file if using DICE
;
dcc -o DWTwin dwtwin.c
quit
;
;   This source code may be altered and used in any way.
*/

#include <stdio.h>
#include <stdlib.h>
#include <dos/dos.h>
#include <ctype.h>
#include <exec/types.h>
#include <exec/exec.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <graphics/rastport.h>
#include <graphics/text.h>
#include <graphics/view.h>
#include <graphics/gfx.h>
#include <graphics/gfxbase.h>
#include <graphics/gfxmacros.h>
#include <intuition/intuition.h>
#include <intuition/screens.h>

#define TCOPY   0 /*-execute TwinExpress copying single file        -*/
#define TCCPY   1 /*-set copy file internal command file            -*/
#define TCEXE   2 /*-execute TwinExpress using internal command file-*/
#define TCDIR   3 /*-set create directory internal command file     -*/
#define TCPTH   4 /*-set change path internal command file          -*/
#define TCANY   5 /*-set any command internal command file          -*/
#define TCEXT   6 /*-execute TwinExpress using external command file-*/
#define TEANY   7 /*-set any command external command file          -*/
#define TCOUT   8 /*-execute TwinExpress using any single command   -*/


#define SFNEW   11 /*-reset internal command file-*/

#define DWTCOM "T:dwt.sincom"
#define DWTLST "T:dwt.intcom"

#define SGADID  1                    /*-string gadget ID-*/

main(int argc,char *argv[])
{
int err = 0;


      /*- CREATE SINGLE COMMAND OR COMMAND FILES & RUN TWIN EXPRESS-*/

  switch(argv[1][0])
        {
         case 'c' : err = TCommand(argv[2],TCOPY,argv[3]);    break;  /* COPY SINGLE FILE */
         case 'l' : err = TCommand(argv[2],TCCPY,NULL);       break;  /* COPY    > INTCOM */
         case 'd' : err = TCommand(NULL,TCDIR,NULL);          break;  /* CRT DIR > INTCOM */
         case 'p' : err = TCommand(NULL,TCPTH,NULL);          break;  /* SET PTH > INTCOM */
         case 'x' : err = TCommand(NULL,TCANY,NULL);          break;  /* ANY COM > INTCOM */
         case 'a' : err = TCommand(NULL,TCEXE,argv[2]);       break;  /* EXE INT COMMAND FILE */
         case 'e' : err = TCommand(argv[2],TCEXT,argv[3]);    break;  /* EXE EXT COMMAND FILE */
         case 'o' : err = TCommand(argv[2],TCOUT,NULL);       break;  /* ANY COMMAND NO SHELL */
         case 'f' : err = TCommand(argv[2],TEANY,NULL);       break;  /* ANY COMMAND NO SHELL */
         case 'n' : err = TCommand(NULL,SFNEW,NULL); exit(0); break;  /* DEL INTCOM */
         default  : CloseDown(1);                             break;
         break;
        }
  CloseDown(err);

  exit(0);
}


int TCommand(char *file_name,int c,char *dir_name)
{
FILE *script;
int err = 0;
char comm_buff[255];
char start[255];

   switch(c)
         {               /*- COPY SINGLE FILE -*/

          case TCOPY   : if((script = fopen(DWTCOM,"w")) == NULL)
                           { err = 2; }
                         else
                           {
                            fprintf(script,"copy %s ~*\n",file_name);
                            fclose(script);
                            sprintf(start,"%stwin <%s > T:dwt.log \n",dir_name,DWTCOM);
                            err = system(start);
                            if(err != 0) sprintf(comm_buff,"DWTwin v2.0 - Dos Error %d (check twin path ?)",err);
                               else sprintf(comm_buff,"copy %s ~*",file_name);
                            WinMessage(comm_buff,2);
                           }
                         break;

                         /*- COPY FILE/FILES DWT.INTCOM-*/

          case TCCPY   : if((script = fopen(DWTLST,"a")) == NULL)
                           { err = 4; }
                         else
                           {
                            fprintf(script,"copy %s ~*\n",file_name);
                            fclose(script);
                            sprintf(comm_buff,"DWTwin v2.0 -: copy %s ~* -> dwt.intcom",file_name);
                            WinMessage(comm_buff,2);
                           }
                         break;

                         /*- CREATE DIRECTORY SET PATH IN DWT.INTCOM -*/

          case TCDIR   : if((script = fopen(DWTLST,"a")) == NULL)
                           { err = 4; }
                         else
                           {
                            strcpy(comm_buff,"mkdir ~");
                            GetCommand(comm_buff,TCDIR,NULL);
                            fprintf(script,"%s \n",comm_buff);
                            fclose(script);
                           }
                         break;

                         /*- SET PATH IN DWT.INTCOM -*/

          case TCPTH   : if((script = fopen(DWTLST,"a")) == NULL)
                           { err = 4; }
                         else
                           {
                            strcpy(comm_buff,"cd ~");
                            GetCommand(comm_buff,TCPTH,NULL);
                            fprintf(script,"%s \n",comm_buff);
                            fclose(script);
                           }
                         break;

                         /*- SET ANY TWIN COMMAND IN DWT.INTCOM -*/

          case TCANY   : if((script = fopen(DWTLST,"a")) == NULL) 
                           { err = 4; }
                         else
                           {
                            err = GetCommand(comm_buff,TCANY,NULL);
                            if(err == 1) { err = 8; }
                            else { fprintf(script,"%s\n",comm_buff); }
                            fclose(script);
                           }
                         break;

                         /*- EXECUTE TWIN USING DWT.INTCOM -*/

          case TCEXE   : if((script = fopen(DWTLST,"a")) == NULL) 
                           { err = 4; }
                         else
                           {
                            fclose(script);
                            sprintf(start,"%stwin <%s > T:dwt.log \n",dir_name,DWTLST);
                            system(start);
                           }
                         break;

                         /*- EXECUTE TWIN USING EXTERNAL COMMAND FILE -*/

          case TCEXT   : if((script = fopen(file_name,"r")) == NULL) 
                           { err = 7; }
                         else
                           {
                            fclose(script);
                            sprintf(start,"%stwin <%s > T:dwt.log \n",dir_name,file_name);
                            system(start);
                           }
                         break;

                         /*- DO ANY TWIN COMMAND IN EXTERNAL COMMAND FILE -*/

          case TEANY   : if((script = fopen(file_name,"a")) == NULL) 
                           { err = 7; }
                         else
                           {
                            GetCommand(comm_buff,TEANY,NULL);
                            fprintf(script,"%s\n",comm_buff);
                            fclose(script);
                           }
                         break;

                         /*- ANY SINGLE COMMAND NO SHELL -*/

          case TCOUT   : if((script = fopen(DWTCOM,"w")) == NULL) 
                           { err = 2; }
                         else
                           {
                            GetCommand(comm_buff,TCANY,NULL);
                            fprintf(script,"%s\n",comm_buff);
                            fclose(script);
                            sprintf(start,"%stwin <%s > T:dwt.log\n",file_name,DWTCOM);
                            system(start);
                           }
                         break;

                          /*- RESET DWT.INTCOM -*/

          case SFNEW    : if((script = fopen(DWTLST,"r")) == NULL) 
                            {
                             break;
                            }
                           else
                            {
                             fclose(script);
                             DeleteFile(DWTLST);
                            }
                         break;
         }
   

   return(err);
}

int WinMessage(char *mbuff,int time_out)
{
struct Window *win;
struct Library *intbase;

struct NewWindow sw = { 100,100,500,11,-1,-1,INACTIVEWINDOW,WINDOWDRAG,NULL,
                        NULL,"DWTwin",NULL,NULL,0,0,0,0,WBENCHSCREEN}; 

  if((int)(struct Library *)intbase = OpenLibrary("intuition.library",37))
    { 
     if(!(win = OpenWindow(&sw))) { CloseLibrary((struct Library *)intbase); return(1); }
    }
  else { return(1); }

  SetWindowTitles(win,mbuff,(char *)-1);
  Delay(50 * time_out);

  CloseWindow(win);
  CloseLibrary(intbase);
  return(0);

}

int GetCommand(char *comm,int c,char *p_buff)
{
  struct Window *win;
  struct Gadget *gadg;
  struct StringInfo *sinfo;
  struct IntuiMessage *msg;
  struct Library *intbase;

  UBYTE sbuff[255];
  UBYTE undo_sbuff[255];

  SHORT spoints_x[] = { 0,0,0,13,0,0,203,0 };
  struct Border sborder_x = { -2,-3,2,0,JAM2,4,spoints_x,NULL};
  SHORT spoints_y[] = { 0,0,204,0,204,13,0,13,0,0 };
  struct Border sborder_y = { -2,-3,1,0,JAM2,5,spoints_y,&sborder_x};

  SHORT spoints_a[] = { 0,0,0,11,0,0,201,0 };
  struct Border sborder_a = { -1,-2,1,0,JAM2,4,spoints_a,&sborder_y};
  SHORT spoints_b[] = { 0,0,202,0,202,11,0,11,0,0 };
  struct Border sborder_b = { -1,-2,2,0,JAM2,5,spoints_b,&sborder_a};
 

  struct StringInfo stringi = { sbuff,undo_sbuff,0,255, };
  struct Gadget sgadget = { NULL,12,16,200,8,SELECTED|GADGHCOMP,GADGIMMEDIATE|RELVERIFY|STRINGLEFT,
                             STRGADGET,(APTR) &sborder_b,NULL,NULL,0,(APTR) &stringi,SGADID,NULL };

  struct NewWindow sw = { 100,100,226,31,-1,-1,GADGETUP|GADGETDOWN,
                          SMART_REFRESH|ACTIVATE,(APTR) &sgadget,NULL,
                          "DWTwin",NULL,NULL,0,0,0,0,WBENCHSCREEN}; 

  SHORT keep_going = TRUE;

  sbuff[0] = '\0';

  if((int)(struct Library *)intbase = OpenLibrary("intuition.library",37))
    { 
     if(!(win = OpenWindow(&sw))) { CloseLibrary((struct Library *)intbase); return(1); }
    }
  else { return(1); }


  switch(c)
        {
         case TCDIR : SetWindowTitles(win, "Create Remote Directory ?", (char *)-1);
                      strcpy(sbuff,comm);
                      strcat(sbuff,p_buff);
                      break;
         case TCPTH : SetWindowTitles(win, "Set Remote Path ?", (char *)-1);
                      strcpy(sbuff,comm);
                      strcat(sbuff,p_buff);
                      break;
         case TCANY : SetWindowTitles(win, "Do Any Command ?", (char *)-1);
                      break;
         case TEANY : SetWindowTitles(win, "Do Any Command [Ext] ?", (char *)-1);
                      break;
        }

  while(keep_going)
   {
     WaitPort(win->UserPort);
     while((msg = (struct IntuiMessage *)GetMsg(win->UserPort)) != NULL)
       {
         switch(msg->Class)
           {
              case ACTIVEWINDOW : ActivateGadget(&sgadget, win, NULL);
                                    break;

              case GADGETUP     : gadg  = (struct Gadget *)msg->IAddress;
                                  sinfo = (struct StringInfo *)gadg->SpecialInfo;

                                  if (gadg->GadgetID == SGADID)
                                     {
                                      sprintf(comm,"%s",sinfo->Buffer);
                                      keep_going = FALSE;
                                     }
                                  break;

              default           : break;

           }

         ReplyMsg((struct Message *)msg);
      }
   }

  CloseWindow(win);
  CloseLibrary(intbase);
  return(0);
}

CloseDown(int code)
{

 switch(code)
       {
        case 1 : printf("-------------------------------------------------------\n");       
                 printf("DWTwin v2.0 - Mark Weller (c)1998                      \n");
                 printf("-------------------------------------------------------\n");       
                 printf("Usage: DWTwin <option> [<filename/twinpath>]           \n");
                 printf("-------------------------------------------------------\n");
                 printf("Remember to run TwinExpress on remote Computer         \n");
                 printf("-------------------------------------------------------\n");         
                 printf("Dwtwin c <filename> <twinpath>     :copy single file   \n");
                 printf("Dwtwin e <ext com file> <twinpath> :execute    [extcom]\n");
                 printf("Dwtwin a <twinpath>                :execute    [intcom]\n");
                 printf("Dwtwin l <filename>                :copy file  [intcom]\n");
                 printf("Dwtwin d  uses internal requester  :create dir [intcom]\n");
                 printf("Dwtwin p  uses internal requester  :set path   [intcom]\n");
                 printf("Dwtwin n                           :reset intcom       \n");
                 printf("Dwtwin x  uses internal requester  :any comnd  [intcom]\n");
                 printf("Dwtwin f <extcomfile> uses intreq  :any comnd  [extcom]\n");
                 printf("Dwtwin o <twinpath>   uses intreq  :any single command \n");
                 printf("-------------------------------------------------------\n");         
                 break;
        case 2 : printf("ERR: Unable to create command file in T: ?\n");
                 break;
        case 3 : printf("ERR: Unable to create start file in T: ?\n");
                 break;
        case 4 : printf("ERR: Unable to create list file in T: ?\n");
                 break;
        case 5 : printf("ERR: Unable to create liststart file in T: ?\n");
                 break;
        case 6 : printf("ERR: Unable to create extstart file in T: ?\n");
                 break;
        case 7 : printf("ERR: Unable to open external command file ?\n");
                 break;
        case 8 : printf("ERR: Problem with intuition or window ?\n");
                 break;
       } 

}