home *** CD-ROM | disk | FTP | other *** search
/ Archive Magazine 1996 / ARCHIVE_96.iso / discs / mag_discs / volume_8 / issue_04 / pocketbook / kmac091 / OPLLPC.TXT < prev   
Text File  |  1994-04-25  |  8KB  |  185 lines

  1. OPLLPC.TXT, accessing LPC functionality from OPL
  2. ================================================
  3.  
  4. Most of the macro playback facilities available in KMAC are also
  5. available to Opl programs.  Opl programs can enhance these KMAC
  6. facilities in numerous ways, limited only by the ingenuity of the
  7. programmer.
  8.  
  9. A first example of calling LPC from Opl
  10. ---------------------------------------
  11. You will need:
  12.     a copy of LPC.DYL in a \DYL\ directory
  13.     a copy of KMACLIB.OPO in an \OPO\ directory.
  14.  
  15. Then type the following lines into an Opl program, say TKMACLIB.OPL:
  16.  
  17.     PROC tkmaclib:
  18.       GLOBAL lpcHand%,lpoHand%
  19.       LOCAL pname$(64)
  20.       LOCAL ret%
  21.       LOADM "kmaclib"
  22.       lpOpen:
  23.       WHILE 1
  24.         dInit "Goto process"
  25.         dEdit pname$, "Process name", 20
  26.         IF dialog=0 :BREAK :ENDIF
  27.         ret%=lpWrite:(%g,pname$)
  28.         IF ret%=-33
  29.           gIPRINT "No such process"
  30.         ELSEIF ret%<0
  31.           gIPRINT err$(ret%)
  32.         ELSE
  33.           lpWrite:(%F,"")
  34.           lpWrite:(%I,"Hello "+pname$)
  35.           lpWrite:(%P,"20")
  36.           lpWrite:(%B,"")
  37.         ENDIF
  38.       ENDWH
  39.       lpClose:
  40.     ENDP
  41.  
  42. Translate and run this program and see what it does.
  43.  
  44. Essentially, the user supplies the name of a process to go to.  This
  45. could be "SYSTEM" or "Data.dbf" or whatever.  Then a sequence of 5
  46. lpWrite: commands issue equivalents of the following KMAC commands:
  47.  
  48.    g - to go to the named process, if possible
  49.    F - to make that process foreground
  50.    I - to display an information message in that process
  51.    P - to pause (in this case, for 2 seconds)
  52.    B - to send that process into background again.
  53.  
  54. The Opl program handles any error from the "g" command.
  55.  
  56. KMAC commands not allowed in Opl programs
  57. -----------------------------------------
  58. Not all KMAC commands make sense in Opl programs - for example the
  59. "s" single stepping commands, or the "r" return command.
  60.  
  61. The way to tell if a KMAC command can be used in an lpWrite:
  62. statement in an Opl program is to consult the "Level" field for that
  63. command in the KMAC.DBF syntax database.  Any command whose "Level"
  64. includes "KMAC" explicitly CANNOT be used inside an Opl program.
  65.  
  66. Thus the following are excluded:
  67.     d, e, l, m, q, r, x, s, and h
  68.     J and j - though these can be duplicated using lpSend:
  69.     N and Q - though an Opl program can run dialogs of its own!
  70.  
  71. Armed with the above information, anyone familiar with both
  72.     the Opl language, and
  73.     KMAC commands
  74. should be able to create many Opl programs that contain LPC commands.
  75.  
  76. Launching an Opl program from KMAC
  77. ----------------------------------
  78. An Opl program can be started from KMAC (as part of a normal macro)
  79. by means of the "o" command.  This takes as parameter the name of the
  80. .OPO program to run.  See EGKMA.TXT for an example.
  81.  
  82. If you wish to delay your KMAC macro until the Opl program completes,
  83. follow the "o" command with a "w" command on the following line.
  84.  
  85. Note that an Opl program does not "inherit" any setting from the .KMA
  86. macro that launched it.  In particular, it starts in a state in which
  87. it is not attached to any application, and it needs to attach to an
  88. application, by one means or another, before issuing any lpWrite: or
  89. lpSend: instructions that would communicate with an attached process.
  90.  
  91. Using KMACLIB.OPO
  92. -----------------
  93. The above .OPL program relies on KMACLIB.OPO to encapsulate access to
  94. LPC for it.  See the file KMACLIB.OPL for the source to the
  95. procedures lpOpen:, lpWrite:, lpSend:, and lpClose:. 
  96.  
  97. Note that any Opl program that relies upon KMACLIB.OPO must declare
  98. the GLOBAL variables lpcHand% and lpoHand% - to take, respectively,
  99. the handle of the LPC.DYL category, and the handle of the created
  100. LPCON class instance.
  101.  
  102. Using lpSend:
  103. -------------
  104. See EGKMA.TXT for an example of using lpSend: to good effect.
  105.  
  106. Whereas lpWrite: always in fact uses the LPC_ACTION method of the
  107. LPCON class in LPC, lpSend: allows access to any of the (more than
  108. 40) different methods of LPCON.  Incidentally, whereas the LPC_ACTION
  109. method is guaranteed never to "leave", the other methods of LPCON
  110. invariably DO "leave" on error - which is why lpWrite: uses the Opl
  111. SEND keyword, whereas lpSend: has to use the ENTERSEND keyword.
  112.  
  113. In order to use lpSend:, you need to know the method numbers of the
  114. LPCON class in LPC, as well as the parameters to these methods.  To
  115. find out about these, you ought to consult the source code for
  116. LPC.DYL (available separately).
  117.  
  118. Summary of methods of LPCON class
  119. ---------------------------------
  120. In summary terms, here are the method numbers of the various methods,
  121. together with brief comments on the workings of these methods:
  122.  
  123. (the following is effectively an extract from the category definition
  124. file, LPC.CAT)
  125.  
  126. 0  LPC_DESTROY         Free buffers then root_destroy
  127. 1  LPC_INIT            Set user status word, if any
  128. ! next group of methods are asynchronous
  129. 2  LPC_ACTION          Interpret command and act on it
  130. 3  LPC_KEY             Send key with modifier
  131. 4  LPC_STRING          Send string of keys
  132. 5  LPC_PAUSE           Pause (in client) for specified time
  133. 6  LPC_MESSAGE         Cause message to be displayed
  134. 7  LPC_DISP_MENU       Display menu at given position
  135. 8  LPC_CLIENT_POS      Move process to specified client position
  136. 9  LPC_GROUND_STATE    Bring application to ground state
  137. 10 LPC_ALLCOUNT        Alloc count in attached process
  138. 11 LPC_SELF_CHECK      Self test attached process
  139. 12 LPC_DIALOG          Run remote dialog
  140. 13 LPC_GET_KEY         Get next key press to record
  141. 14 LPC_EXEC            Execute program and attach to it
  142. 15 LPC_WAIT            Wait for completion of last img/opl launched
  143. 16 LPC_BRING_SEND      Bring data then send it as a string
  144. 17 LPC_NAME_SEND       Format name then send it as a string
  145. ! next group are synchronous but have async interfaces via lpc_action
  146. 18 LPC_STORE_PID       Store current pid for later use
  147. 19 LPC_RESTORE_PID     Restore current pid from earlier use
  148. 20 LPC_ATTACH          Try to attach to specified process
  149. 21 LPC_ATTACH_FORE     Attach to foreground process
  150. 22 LPC_ATTACH_FNAME    Try to attach to process specified by file
  151. 23 LPC_ZAP             Kill all specified processes
  152. 24 LPC_KILL            Kill attached process
  153. 25 LPC_TERMINATE       Terminate attached process
  154. 26 LPC_CLOSEDOWN       Closedown message to attached process
  155. 27 LPC_EXEC_IMG        Execute image program
  156. 28 LPC_EXEC_OPL        Execute Opl program
  157. 29 LPC_HOOK_DYL        Application should launch and hook DYL
  158. 30 LPC_CONVERT         Convert selected stored characters to zero
  159. 31 LPC_BEEP            Beep (as in Opl)
  160. ! next group of methods are synchronous set or sense methods
  161. 32 LPC_BRING           Sense link paste data
  162. 33 LPC_RECORD          Turn recording state on or off
  163. 34 LPC_YIELD           Yield CPU to any other processes that need it
  164. 35 LPC_SET_PID         Set attached pid
  165. 36 LPC_SENSE_PID       Sense attached pid
  166. 37 LPC_SENSE_NAME      Sense formatted name of process
  167. 38 LPC_TEST_PID        Test whether could attach to given pid
  168. 39 LPC_STORE           Store text buffer for later use
  169. 40 LPC_PROCESS_INFO    Return menu/dialog/locked/filter/busy/start state
  170. 41 LPC_COUNT_DIALOGS   Return count of dialogs
  171. 42 LPC_SENSE_IOSEM     Return value of io semaphore
  172. 43 LPC_SENSE_AMSTART   Return value of appman.start
  173. 44 LPC_CANCEL          Cancel current activity
  174.  
  175. Synchronous and asynchronous access to LPC
  176. ------------------------------------------
  177. You may notice that the lpc_init method takes a parameter that
  178. indicates whether access to LPC is going to be synchronous (if this
  179. parameter is NULL) or asynchronous (in which case this parameter is
  180. the address of a status word to be signalled when the message
  181. completes).
  182.  
  183. By design, access to LPC from KMAC is asynchronous, but access to LPC
  184. from Opl is expected to be synchronous.
  185.