home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 240.lha / PickPacket_v1.0 / Sources / pickpack.c < prev    next >
C/C++ Source or Header  |  1989-05-04  |  28KB  |  943 lines

  1. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
  2. * |_o_o|\\ Copyright (c) 1989 The Software Distillery.                    *
  3. * |. o.| ||          All Rights Reserved                                  *
  4. * | .  | ||          Written by John Toebes and Doug Walker               *
  5. * | o  | ||          The Software Distillery                              *
  6. * |  . |//           235 Trillingham Lane                                 *
  7. * ======             Cary, NC 27513                                       *
  8. *                    BBS:(919)-471-6436                                   *
  9. \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  10. #include "pickpack.h"
  11. #include "pwgen.h"
  12.  
  13. #ifdef DEBUG
  14. int debug = 0;
  15. #endif
  16.  
  17. #define RES1LINE 124
  18. #define RES2LINE 136
  19.  
  20. static int Sendit(int);
  21. static int PutRes(int, LONG, int, struct MsgPort *);
  22. static int GetArg(int, LONG *, char *);
  23. static void setgad(struct Gadget *, char *, int, struct Window *, int);
  24.  
  25. void main(int, char **);
  26. void MemCleanup(void);
  27.  
  28. /* Global variables */
  29.  
  30. struct Window *Window;
  31. struct TmpRas tmpras;
  32.  
  33.  
  34. static char menutrans[7][14] = {
  35. {
  36. /* FILEHANDLE    */ SEL_HANDLE,
  37. /* FILEINFOBLOCK */ SEL_FILEINFO,
  38. /* INFODATA      */ SEL_INFODATA,
  39. /* BUFFER        */ SEL_BUFFER,
  40. /*               */ 0,
  41. /* SEND          */ SEL_SEND,
  42. /*               */ 0,
  43. /* HELP          */ SEL_HELP,
  44. /*               */ 0,
  45. /* QUIT          */ SEL_QUIT
  46. },
  47.  
  48. {
  49. /* OPENINPUT     */ SEL_OPENINPUT,
  50. /* OPENOUTPUT    */ SEL_OPENOUTPUT,
  51. /* OPENUPDATE    */ SEL_OPENUPDATE,
  52. /* READ          */ SEL_READ,
  53. /* WRITE         */ SEL_WRITE,
  54. /* SEEK          */ SEL_SEEK,
  55. /* CLOSE         */ SEL_CLOSE,
  56. /* TRUNCATE      */ SEL_TRUNCATE
  57. },
  58.  
  59. {
  60. /* LOCK          */ SEL_LOCK,
  61. /* DUPLOCK       */ SEL_DUPLOCK,
  62. /* UNLOCK        */ SEL_UNLOCK,
  63. /* EXAMINE       */ SEL_EXAMINE,
  64. /* EXNEXT        */ SEL_EXNEXT,
  65. /* CREATEDIR     */ SEL_CREATEDIR,
  66. /* DELETE        */ SEL_DELETE,
  67. /* RENAME        */ SEL_RENAME,
  68. /* PARENT        */ SEL_PARENT,
  69. /* SETPROTECT    */ SEL_SETPROTECT,
  70. /* SETCOMMENT    */ SEL_SETCOMMENT,
  71. /* SETDATE       */ SEL_SETDATE
  72. },
  73.  
  74. {
  75. /* CURRENTVOL    */ SEL_CURRENTVOL,
  76. /* INFO          */ SEL_INFO,
  77. /* DISKINFO      */ SEL_DISKINFO,
  78. /* RENAMEDISK    */ SEL_RENAMEDISK
  79. },
  80.  
  81. {
  82. /* DIE           */ SEL_DIE,
  83. /* FLUSH         */ SEL_FLUSH,
  84. /* MORECACHE     */ SEL_MORECACHE,
  85. /* INHIBIT       */ SEL_INHIBIT,
  86. /* WRITE_PROTECT */ SEL_WRITE_PROTECT,
  87. /* NETWORKHELLO  */ SEL_NETWORKHELLO,
  88. /* DEBUG         */ SEL_DEBUG,
  89. /* SETTRANS      */ SEL_SETTRANS
  90. },
  91.  
  92. {
  93. /* PickPacket V1.0   */ 0,
  94. /* Copyright...  */ 0,
  95. /* All Rights..  */ 0,
  96. /* See PickPacket... */ 0,
  97. /* MUG SHOT      */ 0
  98. },
  99.  
  100. {
  101. /* DOSTRUE           -1 */ SEL_MIN1,
  102. /* DOSFALSE           0 */ SEL_ZERO,
  103. /*                      */ 0,
  104. /* OFFSET_BEGINNING  -1 */ SEL_MIN1,
  105. /* OFFSET_CURRENT     0 */ SEL_ZERO,
  106. /* OFFSET_END         1 */ SEL_ONE,
  107. /*                      */ 0,
  108. /* SHARED_LOCK       -2 */ SEL_MIN2,
  109. /* ACCESS_READ       -2 */ SEL_MIN2,
  110. /*                      */ 0,
  111. /* EXCLUSIVE_LOCK    -1 */ SEL_MIN1,
  112. /* ACCESS_WRITE      -1 */ SEL_MIN1,
  113. /*                      */ 0,
  114. /* NULL               0 */ SEL_ZERO
  115. }
  116.  
  117. };
  118.  
  119. UBYTE Buf1[14], Buf2[14], Buf3[14], Buf4[14], BufN[32];
  120. static struct IntuiText 
  121. Buf1Text = {3, 0, JAM2, 328,  62, &TOPAZ80, Buf1, NULL      },
  122. Buf2Text = {3, 0, JAM2, 328,  78, &TOPAZ80, Buf2, &Buf1Text },
  123. Buf3Text = {3, 0, JAM2, 328,  94, &TOPAZ80, Buf3, &Buf2Text },
  124. Buf4Text = {3, 0, JAM2, 328, 110, &TOPAZ80, Buf4, &Buf3Text },
  125. NameText = {3, 0, JAM2,  80,  46, &TOPAZ80, BufN, &Buf4Text };
  126.  
  127. struct packettype
  128.    {
  129.    int number;
  130.    char *name;
  131.    int arg1, arg2, arg3, arg4, res1;
  132.    };
  133.  
  134. struct packettype packets[] = {
  135. { 0 }, /* First action begins at 0 */
  136. { ACTION_FINDINPUT,     "ACTION_FINDINPUT",      HAN, LCK, STR,   0, FLG },
  137. { ACTION_FINDOUTPUT,    "ACTION_FINDOUTPUT",     HAN, LCK, STR,   0, FLG },
  138. { ACTION_FINDUPDATE,    "ACTION_FINDUPDATE",     HAN, LCK, STR,   0, FLG },
  139. { ACTION_READ,          "ACTION_READ",           AG1, BUF, NUM,   0, NUM },
  140. { ACTION_WRITE,         "ACTION_WRITE",          AG1, BUF, NUM,   0, NUM },
  141. { ACTION_SEEK,          "ACTION_SEEK",           AG1, NUM, NUM,   0, NUM },
  142. { ACTION_END,           "ACTION_END",            AG1,   0,   0,   0, FLG },
  143. { ACTION_TRUNCATE,      "ACTION_TRUNCATE",       AG1,   0,   0,   0, FLG },
  144. { ACTION_LOCATE_OBJECT, "ACTION_LOCATE_OBJECT",  LCK, STR, NUM,   0, LCK },
  145. { ACTION_COPY_DIR,      "ACTION_COPY_DIR",       LCK,   0,   0,   0, LCK },
  146. { ACTION_FREE_LOCK,     "ACTION_FREE_LOCK",      LCK,   0,   0,   0, FLG },
  147. { ACTION_EXAMINE_OBJECT,"ACTION_EXAMINE_OBJECT", LCK, FIB,   0,   0, FLG },
  148. { ACTION_EXAMINE_NEXT,  "ACTION_EXAMINE_NEXT",   LCK, FIB,   0,   0, FLG },
  149. { ACTION_CREATE_DIR,    "ACTION_CREATE_DIR",     LCK, STR,   0,   0, LCK },
  150. { ACTION_DELETE_OBJECT, "ACTION_DELETE_OBJECT",  LCK, STR,   0,   0, FLG },
  151. { ACTION_RENAME_OBJECT, "ACTION_RENAME_OBJECT",  LCK, STR, LCK, STR, FLG },
  152. { ACTION_PARENT,        "ACTION_PARENT",         LCK,   0,   0,   0, LCK },
  153. { ACTION_SET_PROTECT,   "ACTION_SET_PROTECT",      0, LCK, STR, NUM, FLG },
  154. { ACTION_SET_COMMENT,   "ACTION_SET_COMMENT",      0, LCK, STR, STR, FLG },
  155. { ACTION_SET_DATE,      "ACTION_SET_DATE",       LCK, BUF,   0,   0, FLG },
  156. { ACTION_CURRENT_VOLUME,"ACTION_CURRENT_VOLUME",   0,   0,   0,   0, VOL },
  157. { ACTION_INFO,          "ACTION_INFO",           LCK, INF,   0,   0, FLG },
  158. { ACTION_DISK_INFO,     "ACTION_DISK_INFO",      INF,   0,   0,   0, FLG },
  159. { ACTION_RENAME_DISK,   "ACTION_RENAME_DISK",    STR,   0,   0,   0, FLG },
  160. { ACTION_DIE,           "ACTION_DIE",              0,   0,   0,   0, FLG },
  161. { ACTION_FLUSH,         "ACTION_FLUSH",            0,   0,   0,   0, FLG },
  162. { ACTION_MORE_CACHE,    "ACTION_MORE_CACHE",     NUM,   0,   0,   0, NUM },
  163. { ACTION_INHIBIT,       "ACTION_INHIBIT",        NUM,   0,   0,   0, FLG },
  164. { ACTION_WRITE_PROTECT, "ACTION_WRITE_PROTECT",  FLG, NUM,   0,   0, FLG },
  165. { ACTION_NETWORK_HELLO, "ACTION_NETWORK_HELLO",  STR,   0,   0,   0, FLG },
  166. { ACTION_HANDLER_DEBUG, "ACTION_HANDLER_DEBUG",  NUM,   0,   0,   0, NUM },
  167. { ACTION_SET_TRANS,     "ACTION_SET_TRANS",      STR, NUM,   0,   0, FLG },
  168. { 0 } /* Last packet type is 0 */
  169. };
  170.  
  171. char *typnames[] = 
  172.   "<UNUSED>     ",
  173.   "STRING       ",
  174.   "BOOLEAN      ",
  175.   "FileLock     ",
  176.   "FileHandle   ",
  177.   "FileInfoBlock",
  178.   "fh_Arg1      ",
  179.   "InfoData     ",
  180.   "Integer      ",
  181.   "Volume Node  ",
  182.   "<BAD 10>     ",
  183.   "Data Buffer  "
  184. };
  185.  
  186. extern struct WBStartup *WBenchMsg;
  187.  
  188. #define NOCONST 12345
  189.  
  190. #define LASTACT ((sizeof(packets)/sizeof(struct packettype))-2)
  191. void main(argc, argv)
  192. int argc;
  193. char **argv;
  194. {
  195.   struct IntuiMessage *message;
  196.   int setconst;
  197.   int run = 1;
  198.   int select, newsel, len;
  199.   struct Gadget *gad;
  200.   struct Window *CurrentWindow;
  201.  
  202.   char *tmpchar;
  203.   BPTR olddir;
  204.  
  205.   olddir = NULL;
  206.   if(argc == 0)
  207.   {
  208.      /* Workbench startup */
  209.      if(WBenchMsg->sm_ArgList->wa_Lock != NULL)
  210.         olddir = CurrentDir(WBenchMsg->sm_ArgList->wa_Lock);
  211.      else
  212.      {
  213.         BUG(1, ("pickpack: Wa_Lock is NULL\n"))
  214.      }
  215.   }
  216.  
  217. #ifdef DEBUG
  218.   if(argc>0 && argv[1][0] == '-' && 
  219.      (argv[1][1] == 'd' || argv[1][1] == 'D'))
  220.   {
  221.      stcd_i(argv[1]+2, &debug);
  222.      BUG(0, ("*** Debugging initialized at level %d\n", debug))
  223.      argc--, argv++;
  224.   }
  225. #endif
  226.  
  227.   if(argc>1) strcpy(DevNameSIBuff, argv[1]);
  228.  
  229.   if ((IntuitionBase = (struct IntuitionBase *)
  230.                OpenLibrary("intuition.library", 0)) == NULL) 
  231.   {
  232.      BUG(0, ("Can't open intuition.library\n"))
  233.      exit(1);
  234.   }
  235.   if ((GfxBase = (struct GfxBase *)
  236.          OpenLibrary("graphics.library", 0)) == NULL) 
  237.   {
  238.      BUG(0, ("Can't open graphics.library\n"))
  239.      exit(2);
  240.   }
  241.   if ((Window = OpenWindow(&NewWindowStructure1)) == NULL) 
  242.   {
  243.      BUG(0, ("Can't open window\n"))
  244.      exit(3);
  245.   }
  246.  
  247.   /* Initialize the code to handle structure windows */
  248.   InitST(Window->UserPort);
  249.  
  250.   SetDrMd(Window->RPort, JAM1);
  251.  
  252.   SetMenuStrip(Window, &Menu1);
  253.  
  254.   select = SEL_LOCK;
  255.   CurrentWindow = NULL;
  256.   setconst = NOCONST;
  257.  
  258.   while(run >= 0)
  259.   {
  260.      BUG(3, ("pickpack: Top of loop\n"))
  261.      if (run)
  262.         {
  263.         memset(BufN, ' ', 24);
  264.         len = strlen(packets[select].name);
  265.         if (len > 23) len = 23;
  266.         memcpy(BufN, packets[select].name, len);
  267.         BufN[23] = 0;
  268.         strcpy(Buf1, typnames[packets[select].arg1]);
  269.         strcpy(Buf2, typnames[packets[select].arg2]);
  270.         strcpy(Buf3, typnames[packets[select].arg3]);
  271.         strcpy(Buf4, typnames[packets[select].arg4]);
  272.         PrintIText(Window->RPort, &NameText, 0, 0);
  273.         run = 0;
  274.         }
  275.  
  276.      while((message = (struct IntuiMessage *) GetMsg(Window->UserPort)) == NULL)
  277.      {
  278.         /* No messages, it's safe to close windows */
  279.         PurgeST();
  280.         Wait(1 << Window->UserPort->mp_SigBit);
  281.      }
  282.      
  283.      switch(message->Class)
  284.      {
  285.         case NEWSIZE:
  286.            status("");
  287.            BUG(2, ("Doing a newsize on the window %08lx\n", message->IDCMPWindow))
  288.            MoveWind(message->IDCMPWindow, 0);
  289.            break;
  290.  
  291.         case CLOSEWINDOW:
  292.            status("");
  293.            BUG(1, ("pickpack: shutting down\n"))
  294.            if (message->IDCMPWindow == Window)
  295.               run = -1;
  296.            else
  297.               {
  298.               BUG(2, ("pickpack: Purge Item\n"))
  299.               UnlinkST(message->IDCMPWindow);
  300.               CurrentWindow = NULL;
  301.               BUG(3, ("pickpack: Active window changed to 0x%08x\n", CurrentWindow))
  302.               }
  303.            setconst = NOCONST;
  304.            break;
  305.  
  306.         case ACTIVEWINDOW:
  307.            if (message->IDCMPWindow != Window)
  308.               CurrentWindow = message->IDCMPWindow;
  309.            BUG(3, ("pickpack: Active window changed to 0x%08x\n", CurrentWindow))
  310.            break;
  311.  
  312.         case INACTIVEWINDOW:
  313.            if (message->IDCMPWindow != Window)
  314.               CurrentWindow = message->IDCMPWindow;
  315.            BUG(3, ("pickpack: InActiveWindow to 0x%08x\n", message->IDCMPWindow))
  316.            break;
  317.  
  318.         case MENUPICK:
  319.            status("");
  320.            if (message->Code == MENUNULL) break;
  321.            newsel = menutrans[MENUNUM(message->Code)][ITEMNUM(message->Code)];
  322.            BUG(9, ("pickpack: MENUNUM %d ITEMNUM %d newsel %d\n",
  323.               MENUNUM(message->Code), ITEMNUM(message->Code), newsel))
  324.            setconst = NOCONST;
  325.            switch(newsel)
  326.            {
  327.               case 0: 
  328.                  BUG(1, ("pickpack: 0 menu pick\n"))
  329.                  break;
  330.  
  331.               case SEL_HELP:
  332.                  goto DOHELP;
  333.                  break;
  334.  
  335.               case SEL_SEND:
  336.                  BUG(2, ("pickpack: Sending packet\n"))
  337.                  if(Sendit(select)) DisplayBeep(NULL);
  338.                  CurrentWindow = NULL;
  339.                  break;
  340.  
  341.               case SEL_HANDLE:
  342.                  BUG(2, ("pickpack: SEL_HANDLE menu pick\n"))
  343.                  CurrentWindow = AllocST(ST_HANDLE, NULL, 0);
  344.                  BUG(3, ("pickpack: Active window changed to 0x%08x\n", CurrentWindow))
  345.                  break;
  346.  
  347.               case SEL_FILEINFO:
  348.                  BUG(2, ("pickpack: SEL_FILEINFO menu pick\n"))
  349.                  CurrentWindow = AllocST(ST_FIB, NULL, 0);
  350.                  BUG(3, ("pickpack: Active window changed to 0x%08x\n", CurrentWindow))
  351.                  break;
  352.  
  353.               case SEL_INFODATA:
  354.                  BUG(2, ("pickpack: SEL_INFODATA menu pick\n"))
  355.                  CurrentWindow = AllocST(ST_INFO, NULL, 0);
  356.                  BUG(3, ("pickpack: Active window changed to 0x%08x\n", CurrentWindow))
  357.                  break;
  358.  
  359.               case SEL_BUFFER:
  360.                  BUG(2, ("pickpack: SEL_BUFFER menu pick\n"))
  361.                  reqinit();
  362.                  BUG(3, ("pickpack: Active window changed to 0x%08x\n", CurrentWindow))
  363.                  break;
  364.  
  365.               case SEL_QUIT:
  366.                  BUG(2, ("pickpack: SEL_QUIT menu pick\n"))
  367.                  run = -1; 
  368.                  break;
  369.  
  370.               case SEL_MIN2:
  371.               case SEL_MIN1:
  372.               case SEL_ZERO:
  373.               case SEL_ONE:
  374.                  setconst = newsel - SEL_ZERO;
  375.                  status("Select field to recieve constant value");
  376.                  break;
  377.  
  378.               default:
  379.                  BUG(2, ("pickpack: %d menu pick\n", newsel))
  380.                  select = newsel;
  381.                  run = 1;
  382.                  break;
  383.            }
  384.            BUG(3, ("pickpack: Menu end Active window changed to 0x%08x\n", CurrentWindow))
  385.            CurrentWindow = NULL;
  386.            break;
  387.  
  388.         case GADGETDOWN:
  389.         case GADGETUP:
  390.            status("");
  391.            BUG(2, ("pickpack: GADGETDOWN/GADGETUP\n"))
  392.            gad = (struct Gadget *)message->IAddress;
  393.            switch(gad->GadgetID)
  394.            {
  395.               case GAD_BUFLEN:
  396.               case GAD_BLOK:
  397.               case GAD_BLCAN:
  398.                  len = reqkill();
  399.                  if(len > 0 && gad->GadgetID != GAD_BLCAN)
  400.                     CurrentWindow = AllocST(ST_DATA, NULL, len);
  401.                  break;
  402.  
  403.               case GAD_SEND:
  404.                  BUG(2, ("pickpack: Sending packet\n"))
  405.                  if(Sendit(select)) DisplayBeep(NULL);
  406.                  CurrentWindow = NULL;
  407.                  break;
  408.  
  409.               case GAD_ARG1:
  410.                  BUG(2, ("pickpack: Case GAD_ARG1\n"))
  411.                  setgad(&STR1, STR1SIBuff, packets[select].arg1,
  412.                         CurrentWindow, setconst);
  413.                  CurrentWindow = NULL;
  414.                  break;
  415.  
  416.               case GAD_ARG2:
  417.                  BUG(2, ("pickpack: Case GAD_ARG2\n"))
  418.                  setgad(&STR2, STR2SIBuff, packets[select].arg2,
  419.                         CurrentWindow, setconst);
  420.                  CurrentWindow = NULL;
  421.                  break;
  422.  
  423.               case GAD_ARG3:
  424.                  BUG(2, ("pickpack: Case GAD_ARG3\n"))
  425.                  setgad(&STR3, STR3SIBuff, packets[select].arg3, 
  426.                         CurrentWindow, setconst);
  427.                  CurrentWindow = NULL;
  428.                  break;
  429.  
  430.               case GAD_ARG4:
  431.                  BUG(2, ("pickpack: Case GAD_ARG4\n"))
  432.                  setgad(&STR4, STR4SIBuff, packets[select].arg4, 
  433.                         CurrentWindow, setconst);
  434.                  CurrentWindow = NULL;
  435.                  break;
  436.  
  437.               case GAD_PREV:
  438.                  BUG(2, ("pickpack: Case GAD_PREV\n"))
  439.                  select--;
  440.                  if (select < 1)
  441.                     select = LASTACT;
  442.                  run = 1;
  443.                  CurrentWindow = NULL;
  444.                  BUG(3, ("pickpack: prev: Active window changed to 0x%08x\n", CurrentWindow))
  445.                  break;
  446.  
  447.               case GAD_NEXT:
  448.                  BUG(2, ("pickpack: Case GAD_NEXT\n"))
  449.                  select++;
  450.                  if (select > LASTACT)
  451.                     select = 1;
  452.                  run = 1;
  453.                  BUG(3, ("pickpack: next: Active window changed to 0x%08x\n", CurrentWindow))
  454.                  CurrentWindow = NULL;
  455.                  break;
  456.  
  457.               case GAD_HANDLE:
  458.                  BUG(2, ("pickpack: GAD_HANDLE gadget pick\n"))
  459.                  CurrentWindow = AllocST(ST_HANDLE, NULL, 0);
  460.                  BUG(3, ("pickpack: Active window changed to 0x%08x\n", CurrentWindow))
  461.                  break;
  462.  
  463.               case GAD_FILEINFO:
  464.                  BUG(2, ("pickpack: GAD_FILEINFO gadget pick\n"))
  465.                  CurrentWindow = AllocST(ST_FIB, NULL, 0);
  466.                  BUG(3, ("pickpack: Active window changed to 0x%08x\n", CurrentWindow))
  467.                  break;
  468.  
  469.               case GAD_INFODATA:
  470.                  BUG(2, ("pickpack: GAD_INFODATA gadget pick\n"))
  471.                  CurrentWindow = AllocST(ST_INFO, NULL, 0);
  472.                  BUG(3, ("pickpack: Active window changed to 0x%08x\n", CurrentWindow))
  473.                  break;
  474.  
  475.               case GAD_BUFFER:
  476.                  BUG(2, ("pickpack: GAD_BUFFER gadget pick\n"))
  477.                  reqinit();
  478.                  BUG(3, ("pickpack: Active window changed to 0x%08x\n", CurrentWindow))
  479.                  break;
  480. #ifdef DEBUG
  481.               case GAD_DEBUG:
  482.                  debug = atoi(DBGVALSIBuff);
  483.                  BUG(1, ("Debugging set to level %d\n", debug))
  484.                  break;
  485. #endif
  486.               case GAD_UP:
  487.               case GAD_DOWN:
  488.               case GAD_SLIDER:
  489.                  BUG(2, ("Doing a move on the window %08lx\n", message->IDCMPWindow))
  490.                  MoveWind(message->IDCMPWindow, GAD_SLIDER-gad->GadgetID);
  491.                  break;
  492.  
  493.               default:
  494.                  BUG(2, ("pickpack: default gadget\n"))
  495.                  CurrentWindow = NULL;
  496.                  BUG(3, ("pickpack: default: Active window changed to 0x%08x\n", CurrentWindow))
  497.                  break;
  498.  
  499.            }
  500.            setconst = NOCONST;
  501.            break;
  502.  
  503.         case SELECTUP:
  504.         case MOUSEBUTTONS:
  505.            BUG(2, ("pickpack: SELECTUP/MOUSEBUTTONS\n"))
  506.            break;  /* Don't change the status() message */
  507.  
  508.         case RAWKEY:
  509.            BUG(2, ("pickpack: RAWKEY\n"))
  510.            status("");
  511.            if (message->Code == 0x5f || /* Help Key */
  512.                message->Code == 0x3a || /* / ? key */
  513.                message->Code == 0x25)   /* h key */
  514.            {
  515. DOHELP:
  516.               BUG(3, ("pickpack: HELP requested\n"))
  517.               if(GetHelp(&tmpchar, &len) ||
  518.                  AllocST(ST_VIEW, (APTR)tmpchar, len))
  519.               {
  520.                  BUG(1, ("pickpack: There's no help for you!\n"))
  521.               }
  522.               
  523.            }
  524.            CurrentWindow = NULL;
  525.            break;
  526.  
  527.         default:
  528.            BUG(2, ("pickpack: Unknown IntuiMessage\n"))
  529.            CurrentWindow = NULL;
  530.            break;
  531.      }
  532.      ReplyMsg((struct Message *)message);
  533.   }
  534.   TermST();
  535.  
  536.   if(olddir) CurrentDir(olddir);
  537.  
  538.   ClearMenuStrip(Window);
  539.   CloseWindow(Window);
  540.   CloseLibrary(IntuitionBase);
  541.   CloseLibrary(GfxBase);
  542.   exit(0);
  543. }
  544.  
  545. static void setgad(gad, buf, type, wind, val)
  546. struct Gadget *gad;
  547. char *buf;
  548. int type;
  549. struct Window *wind;
  550. int val;
  551. {
  552. if (val != NOCONST)
  553.    {
  554.    /* We have a pending constant to deal with */
  555.    switch(type)
  556.        {
  557.        case FLG:
  558.           if (val == 0) strcpy(buf, "DOSTRUE");
  559.           else if (val == -1) strcpy(buf, "DOSFALSE");
  560.           else
  561.              {
  562.              DisplayBeep(NULL);
  563.              status("Invalid flag value");
  564.              return;
  565.              }
  566.           break;
  567.        case LCK:
  568.           if (val != 0)
  569.              {
  570.              DisplayBeep(NULL);
  571.              status("Invalid lock value");
  572.              return;
  573.              }
  574.           /* Fall through to the num */             
  575.        case NUM:
  576.           sprintf(buf, "%d", val);      
  577.           break;
  578.        default:
  579.           status("Numeric argument not allowed");
  580.           DisplayBeep(NULL);
  581.           return;
  582.        }
  583.    }
  584. else if (wind != NULL)
  585.    {
  586.    switch(type)
  587.       {
  588.       case LCK:
  589.       case HAN:
  590.       case FIB:
  591.       case AG1:
  592.       case INF:
  593.       case VOL:
  594.       case BUF:
  595.          strcpy(buf, wind->Title);
  596.          break;
  597.  
  598.       case NUM:
  599.          sprintf(buf, "%d", WindSize(wind));
  600.          break;
  601.  
  602.       default:
  603.          status("Window argument not allowed");
  604.          DisplayBeep(NULL);
  605.          break;
  606.       }
  607.    }
  608.  
  609. else
  610.    {
  611.    status("No argument pending for field");
  612.    return;
  613.    }
  614.  
  615. RefreshGList(gad, Window, NULL, 1);
  616. }
  617.  
  618. #define FNLEN 101
  619. static int fnused;
  620. static char fn1[FNLEN], fn2[FNLEN];
  621.  
  622. static int Sendit(select)
  623. int select;
  624. {
  625.    int rc;
  626.    struct MsgPort *pid;
  627.    char buf[100];
  628.    LONG args[8];
  629.    LONG res[2];
  630.    BUG(1,("Sendit: Entry, select %d device '%s'\n", select, DevNameSIBuff))
  631.  
  632.    pid = DeviceProc(DevNameSIBuff);
  633.    if(!pid)
  634.    {
  635.       BUG(1, ("Sendit: Exit, no such device\n"))
  636.       sprintf(buf, "Unknown device '%s'", DevNameSIBuff);
  637.       status(buf);
  638.       return(RC_ERRNODEVICE);
  639.    }
  640.  
  641.    fnused = 0;
  642.  
  643.    if (rc=GetArg(packets[select].arg1, args,   STR1SIBuff))
  644.    {
  645.      status("Invalid value for dp_Arg1");
  646.      return(rc);
  647.    }
  648.    if (rc=GetArg(packets[select].arg2, args+1, STR2SIBuff))
  649.    {
  650.      status("Invalid value for dp_Arg2");
  651.      return(rc);
  652.    }
  653.    if (rc=GetArg(packets[select].arg3, args+2, STR3SIBuff))
  654.    {
  655.      status("Invalid value for dp_Arg3");
  656.      return(rc);
  657.    }
  658.    if (rc=GetArg(packets[select].arg4, args+3, STR4SIBuff))
  659.    {
  660.      status("Invalid value for dp_Arg4");
  661.      return(rc);
  662.    }
  663.  
  664.    sendpkt(pid, packets[select].number, args, 4, res);
  665.  
  666.    BUG(1, ("Sendit: Sendpkt returned %ld, %ld\n", res[0], res[1]))
  667.  
  668.    PutRes(packets[select].res1, res[0], RES1LINE, pid);
  669.    PutRes(RCNUM, res[1], RES2LINE, pid);
  670.  
  671.    switch(packets[select].number)
  672.    {
  673.       case ACTION_FREE_LOCK:
  674.       {
  675.          struct Window *tmpw;
  676.          tmpw = STToWind(BADDR(args[0]));
  677.          NameST(tmpw, NULL, NULL);
  678.          UnlinkST(tmpw);
  679.          break;
  680.       }
  681.  
  682.       case ACTION_END:
  683.          NameST(STToWind((APTR)args[0]), NULL, NULL);
  684.          break;
  685.  
  686.       case ACTION_FINDINPUT:
  687.       case ACTION_FINDOUTPUT:
  688.       case ACTION_FINDUPDATE:
  689.          if(res[0] == DOSTRUE)
  690.             NameST(STToWind(BADDR(args[0])), STR3SIBuff, pid);
  691.          break;
  692.  
  693.       case ACTION_DISK_INFO:
  694.          DisplayST(STToWind(BADDR(args[0])));
  695.          break;
  696.  
  697.       case ACTION_EXAMINE_OBJECT:
  698.       case ACTION_EXAMINE_NEXT:
  699.       case ACTION_INFO:
  700.          DisplayST(STToWind(BADDR(args[1])));
  701.          break;
  702.  
  703.       case ACTION_READ:
  704.       case ACTION_WRITE:
  705.          DisplayST(STToWind(BADDR(args[0])));
  706.          DisplayST(STToWind((APTR)args[1]));
  707.          break;
  708.    }
  709.  
  710.    return(RC_OK);
  711. }
  712.  
  713. static struct IntuiText ResText = {
  714.     1,0,JAM2,   /* front and back text pens, drawmode and fill byte */
  715.     0,0,        /* XY origin relative to container TopLeft */
  716.     &TOPAZ80,   /* font pointer or NULL for default */
  717.     NULL,       /* pointer to text */
  718.     NULL        /* next IntuiText structure */
  719. };
  720.  
  721.  
  722. static int PutRes(vtype, res, top, pid)
  723. int vtype;
  724. LONG res;
  725. int top;
  726. struct MsgPort *pid;
  727. {
  728.    int rc;
  729.    struct Window *w;
  730.    char data[100];
  731.  
  732.    BUG(1, ("PutRes: Entry, vtype %d\n"))
  733.  
  734.    ResText.IText = data;
  735.    ResText.FrontPen = 1;
  736.    ResText.BackPen = 0;
  737.    memset(data, ' ', 50);
  738.    rc = RC_OK;
  739.    switch(vtype)
  740.    {
  741.       case 0:
  742.          break;
  743.  
  744.       case FLG:
  745.          if(res == DOSFALSE) strcpy(data, "DOSFALSE");
  746.          else if(res == DOSTRUE) strcpy(data, "DOSTRUE");
  747.          else sprintf(data, "??? %ld ???", res);
  748.          break;
  749.  
  750.       case LCK:
  751.          if(res)
  752.          {
  753.             if(AllocST(ST_LOCK, BADDR(res), 0))
  754.             {
  755.                w = STToWind(BADDR(res));
  756.                strcpy(data, w->Title);
  757.                NameST(w, fn1+1, pid);
  758.             }
  759.          }
  760.          else
  761.          {
  762.             strcpy(data, "NULL");
  763.          }
  764.          break;
  765.  
  766.       case RCNUM:
  767.          sprintf(data, "RC %ld - ", res);
  768.          switch(res)
  769.             {
  770.             case 103: strcat(data, "insufficient free store"); break;
  771.             case 105: strcat(data, "task table full!"); break;
  772.             case 120: strcat(data, "argument line invalid or too long"); break;
  773.             case 121: strcat(data, "file is not an object module"); break;
  774.             case 122: strcat(data, "invalid resident library during load"); break;
  775.             case 202: strcat(data, "object in use"); break;
  776.             case 203: strcat(data, "object already exists"); break;
  777.             case 204: strcat(data, "directory not found"); break;
  778.             case 205: strcat(data, "object not found"); break;
  779.             case 206: strcat(data, "invalid window description"); break;
  780.             case 209: strcat(data, "packet request type unknown"); break;
  781.             case 210: strcat(data, "stream name component invalid"); break;
  782.             case 211: strcat(data, "invalid object lock"); break;
  783.             case 212: strcat(data, "object not of required type"); break;
  784.             case 213: strcat(data, "disk not validated"); break;
  785.             case 214: strcat(data, "disk write-protected"); break;
  786.             case 215: strcat(data, "rename across devices attempted"); break;
  787.             case 216: strcat(data, "directory not empty"); break;
  788.             case 218: strcat(data, "device (or volume) not mounted"); break;
  789.             case 219: strcat(data, "seek failure"); break;
  790.             case 220: strcat(data, "comment too big"); break;
  791.             case 221: strcat(data, "disk full"); break;
  792.             case 222: strcat(data, "file is protected from deletion"); break;
  793.             case 223: strcat(data, "file is write protected"); break;
  794.             case 224: strcat(data, "file is read protected"); break;
  795.             case 225: strcat(data, "not a valid DOS disk"); break;
  796.             case 226: strcat(data, "no disk in drive"); break;
  797.             case 232: strcat(data, "no more entries in directory"); break;
  798.             case   0: break;
  799.             default:  strcat(data, "???????"); break;
  800.             }
  801.          break;
  802.  
  803.       case NUM:
  804.          sprintf(data, "%ld", res);
  805.          break;
  806.  
  807.       case VOL:
  808.          rc = RC_ERRBADDATA;
  809.          break;
  810.  
  811.       default:
  812.          rc = RC_ERRBADDATA;
  813.          break;
  814.    }
  815.  
  816.    if(rc == RC_OK) 
  817.    {
  818.       data[strlen(data)] = ' ';
  819.       data[42] = 0;
  820.       PrintIText(Window->RPort, &ResText, 80, top);
  821.       BUG(1, ("PutRes: Data value is %s\n", data))
  822.    }
  823. #ifdef DEBUG
  824.    else
  825.       BUG(1, ("PutRes: Bad RC %d\n", rc))
  826. #endif
  827.  
  828.    return(rc);
  829. }
  830.  
  831. void status(msg)
  832. char *msg;
  833. {
  834. char data[100];
  835. int len;
  836.  
  837. len = strlen(msg);
  838. memset(data, ' ', 50);
  839. if (len > 50) len = 50;
  840. memcpy(data, msg, len);
  841. data[50] = 0;
  842. ResText.FrontPen = 0;
  843. ResText.BackPen = (len == 0 ? 0 : 1);
  844. ResText.IText = data;
  845. PrintIText(Window->RPort, &ResText, 19, 148);
  846. }
  847.  
  848. static int GetArg(vtype, arg, data)
  849. int vtype;
  850. LONG *arg;
  851. char *data;
  852. {
  853.    int rc;
  854.    unsigned char *tmpchar;
  855.    APTR v;
  856.  
  857.    BUG(1, ("GetArg: Entry, vtype %d data %s\n", vtype, data))
  858.  
  859.    *arg = 0;
  860.  
  861.    rc = RC_OK;
  862.    switch(abs(vtype))
  863.    {
  864.       case 0:
  865.          break;
  866.  
  867.       case STR:
  868.          tmpchar = (unsigned char *)(fnused ? fn2 : fn1);
  869.          strcpy(tmpchar+1, data);
  870.          tmpchar[0] = strlen(data);
  871.          *arg = MKBADDR(tmpchar);
  872.          break;
  873.  
  874.       case FLG:
  875.          if(stricmp(data, "DOSTRUE")) *arg = DOSTRUE;
  876.          else if(stricmp(data, "DOSFALSE")) *arg = DOSFALSE;
  877.          else rc = RC_ERRBADDATA;
  878.          break;
  879.  
  880.       case LCK:
  881.          if(data[0] == '0' || data[0] == '\0')
  882.          {
  883.             *arg = NULL;
  884.             break;
  885.          }
  886.          v = FindST(data, ST_LOCK);
  887.          if(!v) rc = RC_ERRBADDATA;
  888.          else *arg = (LONG)MKBADDR(v);
  889.          break;
  890.  
  891.       case HAN:
  892.          v = FindST(data, ST_HANDLE);
  893.          if(!v) rc = RC_ERRBADDATA;
  894.          else *arg = (LONG)MKBADDR(v);
  895.          break;
  896.  
  897.       case FIB:
  898.          v = FindST(data, ST_FIB);
  899.          if(!v) rc = RC_ERRBADDATA;
  900.          else *arg = (LONG)MKBADDR(v);
  901.          break;
  902.  
  903.       case AG1:
  904.          v = FindST(data, ST_HANDLE);
  905.          if(!v) rc = RC_ERRBADDATA;
  906.          else *arg = (LONG)((struct FileHandle *)v)->fh_Arg1;
  907.          break;
  908.  
  909.       case INF:
  910.          v = FindST(data, ST_INFO);
  911.          if(!v) rc = RC_ERRBADDATA;
  912.          else *arg = (LONG)MKBADDR(v);
  913.          break;
  914.  
  915.       case NUM:
  916.          stcd_l(data, arg);
  917.          break;
  918.  
  919.       case VOL:
  920.          rc = RC_ERRBADDATA;
  921.          break;
  922.  
  923.       case BUF:
  924.          v = FindST(data, ST_DATA);
  925.          if(!v) rc = RC_ERRBADDATA;
  926.          else *arg = (LONG)v;
  927.          break;
  928.  
  929.       default:
  930.          rc = RC_ERRBADDATA;
  931.          break;
  932.    }
  933.  
  934. #ifdef DEBUG
  935.    if(rc)
  936.       BUG(1, ("GetArg: Bad RC %d\n", rc))
  937.    else
  938.       BUG(1, ("GetArg: arg %d (0x%08x)\n", *arg, *arg))
  939. #endif
  940.  
  941.    return(rc);
  942. }