home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / DACAPO.LZH / DACAPO / 1B_PIPE / 1B_PIPE.C < prev    next >
C/C++ Source or Header  |  1993-11-21  |  14KB  |  551 lines

  1. /**************************************************************************/
  2. /* Demo-Programm zur 1ST-BASE Messagepipeline von DaCapo                  */
  3. /* (C) Francisco Mendez/SHIFT Computer und Werbung GmbH, 25-04-93         */
  4. /* Letzte Änderung: 15-09-93                                              */
  5. /**************************************************************************/
  6.  
  7. /********** INCLUDE *******************************************************/
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <portab.h>
  13. #include <vdi.h>
  14. #include <aes.h>
  15.  
  16. #include <nkcc.h>
  17. #include <mglobal.h>
  18. #include <mydial.h>
  19.  
  20. #include "1b_pipe.h"
  21. #ifdef RSC_CREATE
  22. #include "1b_pipe.rh"
  23. #include "1b_pipe.rsh"
  24. #endif
  25.  
  26. /********** DEFINE ********************************************************/
  27.  
  28. #define NIL        -1
  29.  
  30. #define PB_INIT    0x1b00    /* Programm -> 1ST_BASE: Systemadressen */
  31. #define BP_INIT    0x1b80    /* 1ST_BASE -> Programm: Rückgabemessagenummer */
  32. #define PB_SFIRST  0x1b09    /* Search First */
  33. #define BP_SFIRST  0x1b89
  34. #define PB_SNEXT   0x1b0a    /* Search next */
  35. #define BP_SNEXT   0x1b8a
  36.  
  37. #define MAX_FIELDS 4         /* Textobjekte in "Feldbezeichner" */
  38. #define MAX_ADR    6         /* Textobjekte in "Adressen" */
  39. #define MAX_ALERT  3         /* Anzahl Fehlermeldungen */
  40. enum {
  41.   AL_NODACAPO,
  42.   AL_NORECORD,
  43.   AL_NOVERSION,
  44. };
  45.  
  46. /********** TYPEDEF *******************************************************/
  47.  
  48. #ifndef __PORTAB__
  49. typedef enum {
  50.   FALSE,
  51.   TRUE,
  52. } BOOLEAN;
  53. #endif
  54.  
  55. enum {
  56.   SEL_MARKED,                /* aktuelle Liste, markierte */
  57.   SEL_NMARKED,               /* aktuelle Liste, nicht markierte */
  58.   SEL_LIST,                  /* aktuelle Liste, alle */
  59.   SEL_ALL,                   /* Gesamtliste */
  60. };
  61.  
  62. typedef struct {
  63.   long msk_len;
  64.   long msk_addr;
  65. } BASE_INFO;
  66.  
  67. /********** Globale Variablen *********************************************/
  68.  
  69. int work_in  [12];
  70. int work_out [57];
  71.  
  72. int handle;
  73. int phys_handle;
  74.  
  75. int gl_hchar;
  76. int gl_wchar;
  77. int gl_hbox;
  78. int gl_wbox;
  79.  
  80. int  gl_apid;
  81. int  acc_id;               /* Kennung von DACAPO */
  82. int  menu_id;
  83. int  msg [8];              /* Nachrichtenpuffer */
  84. int  mode;                 /* Art der Suche */
  85. char *alerts [MAX_ALERT];  /* Alertboxen */
  86.  
  87. OBJECT *maindial;
  88. OBJECT *adrdial;
  89. OBJECT *fieldial;
  90. OBJECT *versdial;
  91.  
  92. /********** Funktionsprototypen *******************************************/
  93.  
  94. BOOLEAN open_vwork  (void);
  95. void    close_vwork (void);
  96.  
  97. int     find_state  (OBJECT *tree, int obj, unsigned int state);
  98. int     is_state    (OBJECT *tree, int obj, unsigned int state);
  99. int     is_flags    (OBJECT *tree, int obj, unsigned int flags);
  100. void    draw_object (OBJECT *tree, int object);
  101.  
  102. void    hndl_alert  (int mesag_num);
  103. int     mydial_do   (DIALINFO *di);
  104. void    myhndl_dial (OBJECT *tree);
  105.  
  106. BOOLEAN init_rsrc   (void);
  107. void    search      (void);
  108. void    get_fields  (void);
  109. void    get_version (void);
  110. void    MainDial    (void);
  111.  
  112. void    gem_prg     (void);
  113.  
  114. /**************************************************************************/
  115.  
  116. BOOLEAN open_vwork (void)
  117.  
  118. {
  119.   register int i;
  120.  
  121.   if ((gl_apid = appl_init()) != NIL) 
  122.   {
  123.     for (i = 1; i < 10; work_in [i++] = 1);
  124.  
  125.     work_in [10] = 2;
  126.     phys_handle  = graf_handle (&gl_wchar, &gl_hchar, &gl_wbox, &gl_hbox);
  127.     work_in [0]  = handle = phys_handle;
  128.  
  129.     v_opnvwk (work_in, &handle, work_out);
  130.  
  131.     return (TRUE);
  132.   } /* if */
  133.     else
  134.       return (FALSE);
  135. } /* open_vwork */
  136.  
  137. /**************************************************************************/
  138. /* Objekt-Routinen                                                        */
  139. /**************************************************************************/
  140.  
  141. int find_state (OBJECT *tree, int obj, unsigned int state)
  142.  
  143. {
  144.   do
  145.   {
  146.     if (is_state (tree, obj, state)) return (obj);
  147.   } while (! is_flags (tree, obj++, LASTOB));
  148.  
  149.   return (NIL);
  150. } /* find_state */
  151.  
  152. /**************************************************************************/
  153.  
  154. BOOLEAN is_state (OBJECT *tree, int obj, unsigned int state)
  155.  
  156. {
  157.   return ((tree [obj].ob_state & state) != 0);
  158. } /* is_state */
  159.  
  160. /**************************************************************************/
  161.  
  162. BOOLEAN is_flags (OBJECT *tree, int obj, unsigned int flags)
  163.  
  164. {
  165.   return ((tree [obj].ob_flags & flags) != 0);
  166. } /* is_flags */
  167.  
  168. /**************************************************************************/
  169.  
  170. void draw_object (OBJECT *tree, int object)
  171.  
  172. {
  173.    RECT r;
  174.  
  175.    wind_update (BEG_UPDATE);
  176.    objc_rect  (tree, object, &r, FALSE);
  177.    objc_draw  (tree, object, MAX_DEPTH, r.x, r.y, r.w, r.h);                       
  178.    wind_update (END_UPDATE);
  179. } /* draw_object */
  180.  
  181. /**************************************************************************/
  182. /* MyDial-Schnittstelle                                                   */
  183. /**************************************************************************/
  184.  
  185. void hndl_alert (int mesag_num)
  186.  
  187. {
  188.   wind_update (BEG_UPDATE);
  189.   do_alert (1, alerts [mesag_num]);
  190.   wind_update (END_UPDATE);
  191. } /* hndl_alert */
  192.  
  193. /**************************************************************************/
  194.  
  195. int mydial_do (DIALINFO *di)
  196.  
  197. {
  198.   int ret;
  199.  
  200.   wind_update (BEG_UPDATE);
  201.   wind_update (BEG_MCTRL);
  202.   ret = dial_do (di, 0);
  203.   wind_update (END_MCTRL);
  204.   wind_update (END_UPDATE);
  205.   
  206.   return (ret);
  207. } /* mydial_do */
  208.  
  209. /**************************************************************************/
  210.  
  211. void myhndl_dial (OBJECT *tree)
  212.  
  213. {
  214.   BOOLEAN ok;
  215.  
  216.   wind_update (BEG_UPDATE);
  217.   wind_update (BEG_MCTRL);
  218.   HndlDial (tree, 0, TRUE, NULL, &ok);
  219.   wind_update (END_MCTRL);
  220.   wind_update (END_UPDATE);
  221. } /* myhndl_dial */
  222.  
  223. /**************************************************************************/
  224. /* Resource initialisieren                                                */
  225. /**************************************************************************/
  226.  
  227. void close_vwork (void) 
  228.  
  229. {
  230.    v_clsvwk (handle);
  231.  
  232. #ifndef RSC_CREATE
  233.    rsrc_free ();
  234. #endif
  235.    appl_exit ();
  236. } /* close_vwork */
  237.  
  238. /**************************************************************************/
  239.  
  240. BOOLEAN init_rsrc (void)
  241.  
  242. {
  243.   register int i;
  244.   
  245. #ifdef RSC_CREATE
  246.  
  247.   for (i = 0; i < NUM_OBS; i++)
  248.     rsrc_obfix (rs_object, i);
  249.   
  250.   for (i = 0; i < MAX_ALERT; i++)
  251.     alerts [i] = rs_frstr [i];
  252.   
  253.   maindial = rs_trindex [MAIN];
  254.   adrdial  = rs_trindex [RECORDS];
  255.   fieldial = rs_trindex [FIELDS];
  256.   versdial = rs_trindex [VERSION];
  257.  
  258. #else
  259.   int mesag_buf [8];
  260.  
  261.   if (! rsrc_load ("1B_PIPE.RSC"))
  262.   {
  263.     form_alert (1, "[3][Kann meine Resource-|datei nicht finden!][Exit]");
  264.     if (_app)
  265.       return (FALSE);
  266.     else
  267.       while (TRUE) evnt_mesag (mesag_buf);
  268.   } /* if */
  269.  
  270.   rsrc_gaddr (R_TREE, MAIN,     &maindial);
  271.   rsrc_gaddr (R_TREE, RECORDS,  &adrdial);
  272.   rsrc_gaddr (R_TREE, FIELDS,   &fieldial);
  273.   rsrc_gaddr (R_TREE, VERSION,  &versdial);
  274.  
  275.   for (i = 0; i < MAX_ALERT; i++)
  276.     rsrc_gaddr (R_STRING, i, &alerts [i]);
  277.  
  278. #endif
  279.  
  280.   if (dial_init (malloc, free, NULL, NULL, NULL, TRUE))
  281.   {
  282.     nkc_init (BE_OFF, handle);      
  283.     nkc_set (0);                       
  284.  
  285.     dial_fix (maindial, TRUE); 
  286.     dial_fix (adrdial,  TRUE); 
  287.     dial_fix (fieldial, TRUE);
  288.     dial_fix (versdial, TRUE);
  289.   } /* if */
  290.   else
  291.     return (FALSE);
  292.  
  293.   return (TRUE);
  294. } /* init_rsrc */
  295.  
  296. /**************************************************************************/
  297. /* 1ST_ADDR-INIT: Versions-Nr. ermitteln (Zeichenkette)                   */
  298. /**************************************************************************/
  299.  
  300. void get_version (void)
  301.  
  302. {
  303.   long version;           /* Zeiger auf "1ST-BASE  V1.00-D" + 10 */
  304.  
  305.   memset (msg, 0, sizeof (msg));
  306.   msg [0] = 0x1A00;
  307.   msg [1] = acc_id;
  308.   msg [2] = gl_apid;
  309.   appl_write (acc_id, 16, msg);
  310.   do
  311.   {
  312.     evnt_mesag (msg);
  313.   } while (msg [0] != 0x1A80);
  314.  
  315.   version = *(long *)&msg [4];
  316.   set_ptext (versdial, VVERSION, (char *)version - 10);
  317.   myhndl_dial (versdial);
  318. } /* get_version */
  319.  
  320. /**************************************************************************/
  321. /* 1ST_BASE-INIT: Feldbezeichner ermitteln                                */
  322. /**************************************************************************/
  323.  
  324. void get_fields (void)
  325.  
  326. {
  327.   BASE_INFO *info;                   /* Rückgabe von PB_INIT */
  328.   int       num;
  329.   char      nums [8];
  330.  
  331.   memset (msg, 0, sizeof (msg));
  332.   msg [0] = PB_INIT;
  333.   msg [1] = acc_id;
  334.   msg [2] = gl_apid;
  335.   msg [3] = 1;
  336.   appl_write (acc_id, 16, msg);
  337.   do
  338.   {
  339.     evnt_mesag (msg);
  340.   } while (msg [0] != BP_INIT);
  341.  
  342.   if (msg [3] > NIL)
  343.   {
  344.     int  i;
  345.     char *s, len;
  346.  
  347.     info = (BASE_INFO *)(*(long *)&msg [4]);
  348.     s   = (char *)info->msk_addr;    /* Zeiger auf Texte */
  349.     num = info->msk_len;             /* Anzahl an Feldern */
  350.  
  351.     sprintf (nums, "%4d", num);
  352.     set_ptext (fieldial, FNUM, nums);
  353.     for (i = 0; i < num && i < MAX_FIELDS; i++)
  354.     {
  355.       len = *s++;                    /* Längenbyte */
  356.       set_ptext (fieldial, FFIELD0 + i, s);
  357.       s += len + 1;                  /* nächstes Längenbyte */
  358.     } /* for */
  359.     myhndl_dial (fieldial);
  360.   } /* if */
  361.   else
  362.     hndl_alert (AL_NOVERSION);
  363. } /* get_fields */
  364.  
  365. /**************************************************************************/
  366. /* Datensätze suchen                                                      */
  367. /**************************************************************************/
  368.  
  369. void search (void)
  370.  
  371. {
  372.   register int i;
  373.   int  delm, subst;
  374.   int  ret;
  375.   long record;                   /* Zeiger auf NULL-terminierten Datensatz */
  376.   char s [MAX_ADR][40];
  377.   char *p, *tmp;
  378.  
  379.   DIALINFO di;
  380.  
  381.   for (i = 0; i < MAX_ADR; i++) *s [i] = EOS;
  382.  
  383.   delm  = ',';                   /* normale Feldtrennung */
  384.   delm  <<= 8;                   /* High Byte */
  385.   subst = ';';                   /* Ersatz für delm bei Export */
  386.   subst &= 0x00FF;               /* Low Byte */
  387.  
  388.   memset (msg, 0, sizeof (msg));
  389.   msg [0] = PB_SFIRST;           /* Messagenummer */
  390.   msg [1] = acc_id;              /* Da Capo-Id */
  391.   msg [2] = gl_apid;             /* eigene Id */
  392.   msg [3] = 1;                   /* Tabelle: 0=Clipboard, 1=erste Datei... */
  393.   msg [4] = mode;                /* Art der Suche */
  394.   msg [5] = delm | subst;
  395.   appl_write (acc_id, 16, msg);  /* ersten Datensatz suchen */
  396.   do
  397.   {
  398.     evnt_mesag (msg);
  399.   } while (msg [0] != BP_SFIRST);
  400.     
  401.   dial_center (adrdial);
  402.   open_dial   (adrdial, TRUE, NULL, &di);
  403.  
  404.   do
  405.   {
  406.     if (msg [3] > NIL)
  407.     {
  408.       record = *(long *)&msg [4];
  409.       p = (char *)record;
  410.       if (p != NULL)
  411.         for (i = 0; i < MAX_ADR; i++)
  412.         {
  413.           memset  (s [i], EOS, 40);
  414.           strncpy (s [i], p, 40);
  415.           p = strchr (p, ',');
  416.           p++;
  417.           tmp = strchr (s [i], ',');
  418.           if (tmp)
  419.             *tmp = EOS;
  420.         } /* for */
  421.     } /* if */
  422.     else
  423.       hndl_alert (AL_NORECORD);
  424.  
  425.     for (i = 0; i < MAX_ADR; i++)
  426.       set_ptext (adrdial, AFIELD0 + i, s [i]);
  427.  
  428.     dial_draw (&di);
  429.     ret = mydial_do (&di);
  430.     if (ret == ANEXT)            /* nächsten Datensatz suchen */
  431.     {
  432.       memset (msg, 0, sizeof (msg));
  433.       msg [0] = PB_SNEXT;
  434.       msg [1] = acc_id;
  435.       msg [2] = gl_apid;
  436.       msg [3] = 0;
  437.       msg [4] = mode;
  438.       msg [5] = delm | subst;
  439.       appl_write (acc_id, 16, msg);
  440.       do
  441.       {
  442.         evnt_mesag (msg);
  443.       } while (msg [0] != BP_SNEXT);
  444.     } /* if */
  445.     undo_state  (adrdial, ret, SELECTED);
  446.     draw_object (adrdial, ret & ~0x8000);
  447.   } while (ret != ACANCEL);
  448.  
  449.   close_dial (TRUE, NULL, &di);
  450. } /* search */
  451.  
  452. /**************************************************************************/
  453.  
  454. void MainDial (void)
  455.  
  456. {
  457.   int      ret, obj;
  458.   DIALINFO di;
  459.  
  460.   acc_id = appl_find ("DACAPO  ");
  461.   if (acc_id < 0)
  462.   {
  463. #if TRUE      /* aber hallo! nur, weil Single-TOS keine ID liefern will */
  464.     if (! _app)
  465.       acc_id = 0;
  466.     else
  467. #endif
  468.     {
  469.       hndl_alert (AL_NODACAPO);
  470.       return;
  471.     } /* else */
  472.   } /* if */
  473.  
  474.   dial_center (maindial);
  475.   open_dial (maindial, TRUE, NULL, &di);
  476.   dial_draw (&di);
  477.   
  478.   do
  479.   {
  480.     ret = mydial_do (&di);
  481.     obj = find_state (maindial, SELMARKED, SELECTED);
  482.     mode = SEL_MARKED + obj - SELMARKED;
  483.  
  484.     switch (ret)
  485.     {
  486.       case MVERSION : get_version ();  break;
  487.       case MFIELDS  : get_fields  ();  break;
  488.       case MSEARCH  : search      ();  break;
  489.     } /* switch */
  490.  
  491.     undo_state  (maindial, ret, SELECTED);
  492.     draw_object (maindial, ret & ~0x8000);
  493.   } while (ret != MEND);
  494.       
  495.   close_dial (TRUE, NULL, &di);
  496. } /* maindial */
  497.  
  498. /**************************************************************************/
  499.  
  500. void gem_prg (void)
  501.  
  502. {
  503.   int mesag_buf [8];                        /* GEM-Nachrichtenpuffer */
  504.  
  505.   if (init_rsrc ())
  506.   {
  507.     if (_app)
  508.       MainDial ();
  509.     else
  510.     {
  511.       menu_id = menu_register (gl_apid, "  Da Capo - 1st Base");
  512.       if (menu_id < 0)
  513.         while (TRUE) evnt_timer (0, 1);     /* Lasse andere Prozesse ran */
  514.  
  515.       while (TRUE)
  516.       {
  517.         evnt_mesag (mesag_buf);             /* auf Nachricht warten */
  518.         switch (mesag_buf [0])
  519.         {
  520.           case AC_OPEN  : if (mesag_buf [4] == menu_id)
  521.                             MainDial ();
  522.                           break;
  523.           case AC_CLOSE : break;
  524.         } /* switch */
  525.       } /* while */
  526.     } /* else */
  527.     
  528.     nkc_exit  ();       /* Tastaturroutinen */
  529.     dial_exit ();       /* MyDials */
  530.   } /* if */
  531. } /* gem_prg */
  532.  
  533. /**************************************************************************/
  534.  
  535. void main (void) 
  536.  
  537. {
  538.   if (open_vwork () == TRUE) 
  539.   {
  540.     gem_prg ();
  541.  
  542.     close_vwork ();
  543.     exit (0);
  544.   } /* if */
  545.   else
  546.   {
  547.     fprintf (stderr, "Fehler bei der Programminitialisierung!");
  548.     exit (NIL);
  549.   } /* else */
  550. } /* main */
  551.