home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD2.bin / bbs / util / golded-1.1.lha / GoldED / data / tools / GEDApp / main.c < prev    next >
C/C++ Source or Header  |  1994-08-12  |  9KB  |  434 lines

  1. /* -----------------------------------------------------------------------------
  2.  
  3.   GEDApp v0.94 - GoldED AppIcon handler, ©1993/94 Dietmar Eilert
  4.                  Gestionnaire d'AppIcône GoldED, ©1993/94 Dietmar Eilert
  5.   DICE:
  6.  
  7.   dcc main.c appIconA.a -// -proto -mRR -mi -pr -2.0 -o ram:GEDApp
  8.  
  9.   ------------------------------------------------------------------------------
  10. */
  11.  
  12. /// "includes"
  13.  
  14. #include <amiga20/exec/exec.h>
  15. #include <string.h>
  16. #include <stdio.h>
  17. #include <string.h>
  18. #include <stdlib.h>
  19. #include <stdarg.h>
  20. #include <amiga20/intuition/intuition.h>
  21. #include <amiga20/dos/dos.h>
  22. #include <amiga20/dos/dosextens.h>
  23. #include <amiga20/dos/rdargs.h>
  24. #include <amiga20/dos/dostags.h>
  25. #include <amiga20/workbench/startup.h>
  26. #include <amiga20/workbench/workbench.h>
  27. #include <amiga20/rexx/errors.h>
  28. #include <amiga20/rexx/rxslib.h>
  29.  
  30. #include <amiga20/clib/alib_protos.h>
  31. #include <amiga20/clib/dos_protos.h>
  32. #include <amiga20/clib/exec_protos.h>
  33. #include <amiga20/clib/icon_protos.h>
  34. #include <amiga20/clib/intuition_protos.h>
  35. #include <amiga20/clib/utility_protos.h>
  36. #include <amiga20/clib/rexxsyslib_protos.h>
  37. #include <amiga20/clib/wb_protos.h>
  38.  
  39. #ifdef PRAGMAS
  40.  
  41. #include "Pragmas/exec.h"
  42. #include "Pragmas/disk.h"
  43. #include "Pragmas/diskfont.h"
  44. #include "Pragmas/dynamic.h"
  45. #include "Pragmas/gadtools.h"
  46. #include "Pragmas/keymap.h"
  47. #include "Pragmas/graphics.h"
  48. #include "Pragmas/icon.h"
  49. #include "Pragmas/input.h"
  50. #include "Pragmas/intuition.h"
  51. #include "Pragmas/layers.h"
  52. #include "Pragmas/locale.h"
  53. #include "Pragmas/misc.h"
  54. #include "Pragmas/timer.h"
  55. #include "Pragmas/wb.h"
  56. #include "Pragmas/xpkmaster.h"
  57. #include "Pragmas/amigaguide.h"
  58. #include "Pragmas/reqtools.h"
  59.  
  60. #endif
  61.  
  62. #define Prototype        extern
  63. #define MAX_LEN          150
  64.  
  65. ///
  66. /// "prototypes"
  67.  
  68. Prototype void   main(ULONG, char **);
  69. Prototype int    wbmain(struct WBStartup *);
  70. Prototype void   MainLoop(void);
  71. Prototype char  *MakeFileName(char *, char *);
  72. Prototype char  *CompletePath(char *);
  73. Prototype char  *StartGED(void);
  74. Prototype struct RexxMsg *SendRexxCommand(char *, char *, struct MsgPort *);
  75. Prototype void   FreeRexxCommand (struct RexxMsg *);
  76. Prototype ULONG  WaitForAnswer(struct MsgPort *);
  77. Prototype char  *LookForGED(void);
  78. Prototype void   ReadWBCmd(ULONG, struct WBArg *);
  79.  
  80. extern struct Library *IconBase;
  81. extern struct Library *DOSBase;
  82. extern struct Library *SysBase;
  83. extern struct Library *IntuitionBase;
  84. extern struct Library *WorkbenchBase;
  85.  
  86. ///
  87. /// "entry points"
  88.  
  89. void
  90. main(argc, argv)
  91.  
  92. ULONG argc;
  93. char *argv[];
  94. {
  95.     MainLoop();
  96. }
  97.  
  98. int
  99. wbmain(struct WBStartup *wbs)
  100. {
  101.     MainLoop();
  102. }
  103.  
  104.  
  105. ///
  106. /// "main loop"
  107.  
  108. /* --------------------------------- MainLoop ----------------------------------
  109.  
  110.  Open AppIcon, handle incoming messages
  111.  
  112.  Ouvrir l'AppIcône, gérer les messages reçus
  113.  
  114. */
  115.  
  116. void
  117. MainLoop()
  118. {
  119.     const char *version = "$VER: GEDApp 0.92 (24.3.94)";
  120.  
  121.     struct DiskObject *appDiskObject;
  122.  
  123.     if (!(appDiskObject = GetDiskObject("envarc:GoldED/AppIcon")))
  124.         appDiskObject = GetDefDiskObject(WBTOOL);
  125.  
  126.     if (appDiskObject) {
  127.  
  128.         struct MsgPort     *msgPort;
  129.         struct AppMessage  *amsg;
  130.         struct AppIcon     *appIcon;
  131.  
  132.         if (msgPort = CreateMsgPort()) {
  133.  
  134.             if (appIcon = AddAppIconA(0, NULL, "GED", msgPort, NULL, appDiskObject, TAG_END)) {
  135.  
  136.                 BOOL terminated = FALSE;
  137.  
  138.                 while (!terminated) {
  139.  
  140.                     WaitPort(msgPort);
  141.  
  142.                     while (amsg = (struct AppMessage *)GetMsg(msgPort)) {
  143.  
  144.                         if (amsg->am_NumArgs)
  145.                             ReadWBCmd(amsg->am_NumArgs, amsg->am_ArgList);
  146.                         else
  147.                             terminated = TRUE;
  148.  
  149.                         ReplyMsg((struct Message *)amsg);
  150.                     }
  151.                 }
  152.             }
  153.             else {
  154.  
  155.                 puts("Couldn't allocate AppIcon. Workbench closed ?!");
  156.                 puts("Impossible d'allouer l'AppIcon. Le Workbench est fermé ?!");
  157.             }
  158.  
  159.             RemoveAppIcon(appIcon);
  160.  
  161.             DeleteMsgPort(msgPort);
  162.         }
  163.         else {
  164.  
  165.             puts("Couldn't create message port ?!");
  166.             puts("Impossible de créer le port message ?!");
  167.         }
  168.  
  169.         FreeDiskObject(appDiskObject);
  170.     }
  171.     else {
  172.  
  173.         puts("Impossible d'allouer DiskObject ?!");
  174.         puts("Couldn't allocate DiskObject ?!");
  175.     }
  176.  
  177.     exit(0);
  178. }
  179.  
  180.  
  181. ///
  182. /// "misc"
  183.  
  184. /* ------------------------------- MakeFileName --------------------------------
  185.  
  186.  Build fully qualified path from file/path names; return pointer to static copy.
  187.  
  188.  Générer le chemin d'accès complet à partir des icônes; retourne un pointeur
  189.  pour une copie statique.
  190.  
  191. */
  192.  
  193. char *
  194. MakeFileName(path, file)
  195.  
  196. char *path, *file;
  197. {
  198.     static char buffer[MAX_LEN + 1];
  199.  
  200.     strcpy(buffer, "\42");
  201.  
  202.     strcat(buffer, path);
  203.  
  204.     CompletePath(buffer);
  205.  
  206.     strcat(buffer, file);
  207.  
  208.     strcat(buffer, "\42");
  209.  
  210.     return(buffer);
  211. }
  212.  
  213. /* ------------------------------ CompletePath -----------------------------------
  214.  
  215.  Add '/' to path if missing so far
  216.  
  217.  Ajouter un '/' au chemin si nécessaire
  218.  
  219. */
  220.  
  221. char *
  222. CompletePath(char *path)
  223. {
  224.     UWORD len;
  225.  
  226.     if (len = strlen(path))
  227.         if ((path[len - 1] != ':') && (path[len - 1] != '/'))
  228.             strcat(path, "/");
  229.  
  230.     return(path);
  231. }
  232.  
  233. /* ---------------------------------- ReadWBCmd --------------------------------
  234.  
  235.  Parse AppIcon message
  236.  
  237.  Analyser le message AppIcon
  238.  
  239. */
  240.  
  241. void
  242. ReadWBCmd(numArgs, argList)
  243.  
  244. ULONG  numArgs;
  245. struct WBArg  *argList;
  246. {
  247.     char *host;
  248.     BOOL loadGED = !(host = LookForGED());
  249.  
  250.     if (loadGED)
  251.         host = StartGED();
  252.  
  253.     if (host) {
  254.  
  255.         struct MsgPort *replyPort;
  256.  
  257.         if (replyPort = CreateMsgPort()) {
  258.  
  259.             if (SendRexxCommand(host, "LOCK CURRENT", replyPort)) {
  260.  
  261.                 if (WaitForAnswer(replyPort) == RC_OK) {
  262.  
  263.                     UWORD count;
  264.                     char  path[MAX_LEN + 1], *command;
  265.  
  266.                     for (count = 0; numArgs--; count++) {
  267.  
  268.                         NameFromLock(argList[count].wa_Lock, path, MAX_LEN);
  269.  
  270.                         command = MakeFileName(path, argList[count].wa_Name);
  271.  
  272.                         strins(command, "OPEN SMART QUIET ");
  273.  
  274.                         if (SendRexxCommand(host, command, replyPort))
  275.                             WaitForAnswer(replyPort);
  276.                     }
  277.                 }
  278.  
  279.                 if (SendRexxCommand(host, "UNLOCK", replyPort))
  280.                     WaitForAnswer(replyPort);
  281.             }
  282.  
  283.             DeleteMsgPort(replyPort);
  284.         }
  285.     }
  286. }
  287.  
  288.  
  289. /* ----------------------------------- LookForGED ----------------------------
  290.  
  291.  Look for running GoldED task (check GOLDED.1 to GOLDED.9)
  292.  
  293.  Rechercher la tâche GoldED (vérifier GOLDED.1 à GOLDED.9)
  294.  
  295. */
  296.  
  297. char *
  298. LookForGED()
  299. {
  300.     static char host[] = "GOLDED.1";
  301.     UWORD  try;
  302.  
  303.     for (try = '1'; try <= '9'; try++) {
  304.  
  305.         host[7] = try;
  306.  
  307.         if (FindPort(host))
  308.             return(host);
  309.     } 
  310.  
  311.     return(NULL);
  312. }
  313.  
  314. /* ------------------------------------- StartGED -----------------------------
  315.  
  316.  Launch a new GoldED task. Return pointer to host name (or NULL).
  317.  
  318.  Démarrer une nouvelle tâche GoldED. Retourne un pointeur sur le nom de l'hôte
  319.  (ou NULL).
  320.  
  321. */
  322.  
  323. char *
  324. StartGED()
  325. {
  326.     static char *host = "GOLDED.1";
  327.  
  328.     if (!SystemTags("GoldED:GoldED", SYS_Asynch, TRUE, SYS_Input, NULL, SYS_Output, NULL, TAG_DONE))
  329.  
  330.         UWORD try;
  331.  
  332.         for (try = 50; try; try--, Delay(10))
  333.             if (FindPort(host))
  334.                 return(host);
  335.  
  336.     return(FALSE);
  337. }
  338.  
  339. ///
  340. /// "ARexx"
  341.  
  342. /* -------------------------------------- WaitForAnswer -----------------------
  343.  
  344.   Wait for answer on previously sent message. Free message afterwards. Primary
  345.   return code is returned.
  346.  
  347.   Attendre une réponse du message envoyé précédemment. Libérer ensuite le
  348.   message. Le code de retour primaire est retourné.
  349.  
  350. */
  351.  
  352. ULONG
  353. WaitForAnswer(port)
  354.  
  355. struct MsgPort *port;
  356. {
  357.     struct RexxMsg *rexxMsg;
  358.     ULONG  result;
  359.  
  360.     do {
  361.         
  362.         WaitPort(port);
  363.  
  364.         if (rexxMsg = (struct RexxMsg *)GetMsg(port))
  365.             result = rexxMsg->rm_Result1;
  366.  
  367.     } while (!rexxMsg);
  368.  
  369.     FreeRexxCommand(rexxMsg);
  370.  
  371.     retur