home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / vafunc / vafunc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-27  |  8.9 KB  |  451 lines

  1. /* AV-Protokoll Call Functionen
  2. *
  3. * Stand: 16.4.91
  4. *
  5. * Definiert einige Funktionen für die Kommunikation zwischen
  6. * einem Accessorie und Venus bzw. Gemini bzw. einem Programm, welches
  7. * das AV-Protokoll beherrscht.
  8. *
  9. * Copyright (c) 1990 by Stephan Gerle
  10. *   additions   1994 by Mark Davidson
  11. */
  12.  
  13. #include <aes.h>
  14. #include <string.h>
  15. #include <stdarg.h>
  16. #include <time.h>
  17.  
  18. #include <vafunc.h>
  19.  
  20. #define GEMINI "GEMINI  "
  21. #define AVSERVER "AVSERVER"
  22.  
  23. #define    VA_NORETURNMSG    0
  24.  
  25. static char    _sccs[] = "@(#)AV-Protokoll calling Functions (c) 1990 by Stephan Gerle "__DATE__;
  26.  
  27. #define    AVHasProto(word,bit)    (AVStatus[word]&(1<<bit))
  28.  
  29. static short    AVStatus[3],    /* Was kann die Hauptapplikation */
  30.             AVActiveFlag=0,    /* Ist obiger Wert korrekt? */
  31.             AVMyProtoStatus = 0,/* Protokollstatus des Acc's */
  32.             AVMyApId=0;        /* ApId des Acc's */
  33. static char    *AVMyName = "";/* AV-Name des Acc's */
  34. char            AVName[9]="";/* AV-Name der Hauptapplikation */
  35.  
  36.  
  37. static int GotAVServer = 0;
  38. static short ap_id;
  39. extern int _XMODE;
  40.  
  41. int
  42. GetAVServer(void)
  43. {
  44. int Id;
  45. char *VaPtr = NULL;
  46. static char AVServer[9];
  47.     GotAVServer = 1;
  48.     
  49.     if (_AESglobal[1] != -1)
  50.     {
  51.         return 0;
  52.     }
  53.  
  54.     if ((Id = appl_find(GEMINI)) != -1)
  55.     {
  56.         return Id;
  57.     }
  58.     if ((Id = appl_find(AVSERVER)) != -1)
  59.     {
  60.         return Id;
  61.     }
  62.     shel_envrn(&VaPtr, "AVSERVER=");
  63.     
  64.     if (VaPtr != NULL)
  65.     {
  66.         sprintf(AVServer, "%8.8s", VaPtr);
  67.         if ((Id = appl_find(AVServer)) != -1)
  68.         {
  69.             return Id;
  70.         }
  71.     }
  72.     
  73.     return 0;
  74. }
  75.  
  76. int ApplWrite(int dummy, int length, void *message)
  77. {
  78. int RetVal;
  79.     //Debug("ApplWrite");
  80.     
  81.     if (GotAVServer == 0)
  82.     {
  83.         ap_id = GetAVServer();
  84.     }
  85.     
  86.     RetVal = appl_write(ap_id, length, message); 
  87.     return (RetVal);
  88. }
  89.  
  90. int    AVActive(void)
  91. {
  92.     short    msg[8];
  93.     
  94.     //Debug("AVActive");
  95.     
  96.     if ((_XMODE != 2) && (_AESglobal[0] < 0x340))            return 0;
  97.     
  98.     if (AVActiveFlag)    return AVStatus[0]|AVStatus[1]|AVStatus[2];
  99.     
  100.     msg[0] = AV_PROTOKOLL;
  101.     msg[1] = AVMyApId;
  102.     msg[2] = 0;
  103.     AVSTR2MSG(msg,6,AVMyName);
  104.     msg[3] = AVMyProtoStatus;
  105.     msg[4] = msg[5] = 0;
  106.     ApplWrite(0,(int)sizeof(short [8])+msg[2],msg); 
  107.     AVStatus[0] = AVStatus[1] = AVStatus[2] = 0;
  108.     AVActiveFlag = 1;
  109.     *AVName = 0;
  110.     return 0;
  111. }
  112.  
  113. void    AVInit(int myapid,char *myname,int myprotostatus)
  114. {
  115.     //Debug("AVInit");
  116.     AVMyName = myname;
  117.     AVMyProtoStatus = myprotostatus;
  118.     AVMyApId=myapid;
  119.     AVActive();
  120. }
  121.  
  122. /* Sorgt dafür, das der AV-Protokoll-Status neu ermittelt wird. */
  123. void    AVGetNewProtoStatus(void)
  124. {
  125.     //Debug("AVGetNewProtoStatus");
  126.     AVActiveFlag = 0;
  127.     *AVName = 0;
  128.     AVStatus[0] = AVStatus[1] = AVStatus[2] = 0;
  129.     AVActive();
  130. }
  131.  
  132. int    AVProcessMsg(short *msg)
  133. {
  134.     int    ret;
  135.     
  136.     //Debug("AVProcessMsg");
  137.     
  138.     switch (msg[0])
  139.     {
  140.         case    AC_CLOSE:            AVGetNewProtoStatus();
  141.                             return 0;
  142.                             
  143.         case VA_PROTOSTATUS:    if (    msg[3]==AVStatus[0] &&
  144.                                 msg[4]==AVStatus[1] &&
  145.                                 msg[5]==AVStatus[2])
  146.                                 ret = 0;
  147.                             else
  148.                             {
  149.                                 ret = 1; 
  150.                                 AVStatus[0] = msg[3];
  151.                                 AVStatus[1] = msg[4];
  152.                                 AVStatus[2] = msg[5];
  153.                                 AVActiveFlag = 1;
  154.                             }
  155.                             if (AVMSG2STR(msg,6))
  156.                                 strcpy(AVName,AVMSG2STR(msg,6));
  157.                             else    *AVName = 0;
  158.                             return ret;
  159.     }
  160.     return 0;
  161. }
  162.  
  163. /* Sendet den Status an die Hauptapplikation. */
  164. int    AVSendStatus(char *status)
  165. {
  166.     short    msg[8];
  167.     
  168.     //Debug("AVSendStatus");
  169.     
  170.     if (AVActive() && AVHasProto(0,7))
  171.     {
  172.         msg[0] = AV_STATUS;
  173.         msg[1] = AVMyApId;
  174.         msg[2] = 0;
  175.         AVSTR2MSG(msg,3,status);
  176.         ApplWrite(0,(int)sizeof(short [8])+msg[2],msg); 
  177.         return 1;
  178.     }
  179.     return 0;
  180. }
  181.  
  182. void    AVReceiveStatus(void)
  183. {
  184.     short    msg[8];
  185.     
  186.     //Debug("AVReceiveStatus");
  187.     
  188.     if (AVActive() && AVHasProto(0,7))
  189.     {
  190.         msg[0] = AV_GETSTATUS;
  191.         msg[1] = AVMyApId;
  192.         msg[2] = 0;
  193.         ApplWrite(0,(int)sizeof(short [8])+msg[2],msg);
  194.     }
  195. }
  196.  
  197. /* Emittelt den für Verzeichnisfenster eingestellten Font und die
  198.    Fonthöhe */
  199. int    AVAskFileFont(void)
  200. {
  201.     short    msg[8];
  202.     
  203.     //Debug("AVAskFileFont");
  204.     
  205.     if (AVActive() && AVHasProto(0,1))
  206.     {
  207.         msg[0] = AV_ASKFILEFONT;
  208.         msg[1] = AVMyApId;
  209.         msg[2] = 0;
  210.         ApplWrite(0,(int)sizeof(short [8])+msg[2],msg);
  211.         return 1;
  212.     }
  213.     return 0;
  214. }
  215.  
  216. /* Dasselbe wie AVAskFileFont, nur für das Console-Fenster */
  217. int    AVAskConsoleFont(void)
  218. {
  219.     short    msg[8];
  220.     
  221.     //Debug("AVAskConsoleFont");
  222.  
  223.     if (AVActive() && AVHasProto(0,2))
  224.     {
  225.         msg[0] = AV_ASKCONFONT;
  226.         msg[1] = AVMyApId;
  227.         msg[2] = 0;
  228.         ApplWrite(0,(int)sizeof(short [8])+msg[2],msg); 
  229.         return 1;
  230.     }
  231.     return 0;
  232. }
  233.  
  234. /* Liefert einen Pointer auf einen String, in dem die Namen der
  235.    selektierten Objekte (getrennt durch ' ') stehen.
  236.    Bei Fehler wird NULL zurückgeliefert */
  237. void    AVAskSelectedObjects(void)
  238. {
  239.     short    msg[8];
  240.     
  241.     //Debug("AVAskSelectedObjects");
  242.  
  243.     if (AVActive() && AVHasProto(0,3))
  244.     {
  245.         msg[0] = AV_ASKOBJECT;
  246.         msg[1] = AVMyApId;
  247.         msg[2] = 0;
  248.         ApplWrite(0,(int)sizeof(short [8])+msg[2],msg); 
  249.     }
  250. }
  251.  
  252. /* Sagt Gemini, daß das Console-Fenster geöffnet werden soll. */
  253. int    AVOpenConsole(void)
  254. {
  255.     short    msg[8];
  256.     
  257.     //Debug("AVOpenConsole");
  258.  
  259.     if (AVActive() && AVHasProto(0,2))
  260.     {
  261.         msg[0] = AV_OPENCONSOLE;
  262.         msg[1] = AVMyApId;
  263.         msg[2] = 0;
  264.         ApplWrite(0,(int)sizeof(short [8])+msg[2],msg); 
  265.         return 1;
  266.     }
  267.     return 0;
  268. }
  269.  
  270. /* Sagt Venus bzw. Gemini, das ein Fenster mit dem Verzeichnis
  271.    pfad und der Maske mask geöffnet werden soll. */
  272. int    AVOpenWindow(char *pfad,char *mask)
  273. {
  274.     short    msg[8];
  275.     
  276.     //Debug("AVOpenWindow");
  277.     
  278.     if (AVActive() && AVHasProto(0,4))
  279.     {
  280.         msg[0] = AV_OPENWIND;
  281.         msg[1] = AVMyApId;
  282.         msg[2] = 0;
  283.         strupr(pfad);
  284.         if (pfad[strlen(pfad)-1] != '\\')
  285.             strcat(pfad,"\\");
  286.         AVSTR2MSG(msg,3,pfad);
  287.         AVSTR2MSG(msg,5,mask);
  288.         ApplWrite(0,(int)sizeof(short [8])+msg[2],msg); 
  289.         return 1;
  290.     }
  291.     return 0;
  292. }
  293.  
  294. /* Startet mittels Venus bzw. Gemini ein Programm. In pfad steht
  295.    der komplette Pfad und der Programmname. cmdline enthält
  296.    die Kommandozeile für das zu startende Programm. */
  297. int    AVStartProgram(char *pfad,char *cmdline)
  298. {
  299.     short    msg[8];
  300.     
  301.     //Debug("AVStartProgram");
  302.     if (AVActive() && AVHasProto(0,5))
  303.     {
  304.         msg[0] = AV_STARTPROG;
  305.         msg[1] = AVMyApId;
  306.         msg[2] = 0;
  307.         strupr(pfad);
  308.         AVSTR2MSG(msg,3,pfad);
  309.         AVSTR2MSG(msg,5,cmdline);
  310.         ApplWrite(0,(int)sizeof(short [8])+msg[2],msg); 
  311.         return 1;
  312.     }
  313.     return 0;
  314. }
  315.  
  316. /* Sagt dem Hauptprogramm, daß das Accessorie ein Fenster geöffnet hat. */
  317. int    AVAccOpenedWindow(int winhandle)
  318. {
  319.     short    msg[8];
  320.     
  321.     //Debug("AVAccOpenedWindow");
  322.     if (AVActive() && AVHasProto(0,6))
  323.     {
  324.         msg[0] = AV_ACCWINDOPEN;
  325.         msg[1] = AVMyApId;
  326.         msg[2] = 0;
  327.         msg[3] = winhandle;
  328.         ApplWrite(0,(int)sizeof(short [8])+msg[2],msg); 
  329.         return 1;
  330.     }
  331.     return 0;
  332. }
  333.  
  334. /* Sagt VENUS, daß das Accessorie ein Fenster geschlossen hat.
  335.    (ist nur bei nicht durch AC_CLOSE bedingtem Schließen notwendig) */
  336. int    AVAccClosedWindow(int winhandle)
  337. {
  338.     short    msg[8];
  339.  
  340.     //Debug("AVAccClosedWindow");
  341.     if (AVActive() && AVHasProto(0,6))
  342.     {
  343.         msg[0] = AV_ACCWINDCLOSED;
  344.         msg[1] = AVMyApId;
  345.         msg[2] = 0;
  346.         msg[3] = winhandle;
  347.         ApplWrite(0,(int)sizeof(short [8])+msg[2],msg); 
  348.         return 1;
  349.     }
  350.     return 0;
  351. }
  352.  
  353. /* Schickt VENUS/GEMINI einen Tastaturevent. Ist dann anzuwenden,
  354.    wenn ein ACC ein Fenster offen hat, und einen Tastendruck bekommt,
  355.    den es selber nicht versteht. */
  356. int    AVSendKeyEvent(int state,int key)
  357. {
  358.     short    msg[8];
  359.     
  360.     //Debug("AVSendKeyEvent");
  361.  
  362.     if (AVActive() && AVHasProto(0,0))
  363.     {
  364.         msg[0] = AV_SENDKEY;
  365.         msg[1] = AVMyApId;
  366.         msg[2] = 0;
  367.         msg[3] = state;
  368.         msg[4] = key;
  369.         ApplWrite(0,(int)sizeof(short [8])+msg[2],msg); 
  370.         return 1;
  371.     }
  372.     return 0;
  373. }
  374.  
  375. int    AVCopyDragged(int kstate,char *dest)
  376. {
  377.     short    msg[8];
  378.     
  379.     //Debug("AVCopyDragged");
  380.  
  381.     if (AVActive() && AVHasProto(0,8))
  382.     {
  383.         msg[0] = AV_COPY_DRAGGED;
  384.         msg[1] = AVMyApId;
  385.         msg[2] = 0;
  386.         msg[3] = kstate;
  387.         AVSTR2MSG(msg,4,dest);
  388.         ApplWrite(0,(int)sizeof(short [8])+msg[2],msg);
  389.         return 1;
  390.     }
  391.     return 0;
  392. }
  393.  
  394.  
  395. /* The next two functions are not really part of the VA-Protocol
  396.    but they may be useful */
  397.  
  398.  
  399. char HelpString[200];
  400.  
  401. int  
  402. CallSTGuide(char *help, char *pattern)  
  403. {  
  404.     short msg[8], i;
  405.   
  406.     if ((i=appl_find("ST-GUIDE"))>=0) 
  407.     {  
  408.         msg[0] = VA_START;
  409.         msg[1] = AVMyApId;
  410.         msg[2] = 0;
  411.         sprintf(HelpString, "%s %s", help, pattern);
  412.         strupr(HelpString);
  413.         AVSTR2MSG(msg,3,HelpString);
  414.         msg[5] = 0;
  415.         msg[6] = 0;
  416.         msg[7] = 0;
  417.         appl_write(i, 16, msg);
  418.         return 0;
  419.     }
  420.     return 1;  
  421. }  
  422.  
  423. #define AC_HELP 1025
  424. #define HELP_FILE_MAGIC  0x1993
  425.  
  426. /* This only supports calling 1STGuide as a file viewer */
  427.  
  428. int  
  429. Call1STGuide(char *file)  
  430. {  
  431.     short msg[8], i;
  432.     
  433.     strcpy(HelpString, file);
  434.   
  435.     if ((i=appl_find("1STGUIDE"))>=0) 
  436.     {  
  437.         msg[0] = AC_HELP;
  438.         msg[1] = AVMyApId;
  439.         msg[2] = 0;
  440.         msg[3] = 0;
  441.         msg[4] = 0;
  442.         msg[5] = HELP_FILE_MAGIC;
  443.         AVSTR2MSG(msg,6, HelpString);
  444.         appl_write(i, 16, msg);
  445.         return 0;
  446.     }
  447.     return 1;  
  448. }  
  449.  
  450.  
  451.