home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 14 Text / 14-Text.zip / da2inf.zip / DA2LVL3.TXT < prev    next >
Text File  |  1994-02-16  |  48KB  |  1,600 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.   DISTRIBUTED APPLICATION/2
  8.   _________________________
  9.  
  10.  
  11.  
  12.  
  13.  
  14.   INTRODUCING DISTRIBUTED APPLICATION/2
  15.   _____________________________________
  16.  
  17.   Distributed Application/2 (DA/2) is a set of application programming inter-
  18.   faces (API's) that provide a simple and consistent way to access interprocess
  19.   and network communication functions under Operating System/2(*) (OS/2*) 2.0
  20.   and 2.1.  DA/2 supplies a set of API's through the concepts of OPEN, WRITE,
  21.   READ, and CLOSE that provide an easy mechanism for communicating between a
  22.   server and a client.  Additional event API's provide a mechanism for synchro-
  23.   nizing communication between a server and multiple clients.
  24.  
  25.  
  26.   SUPPORTED COMMUNICATIONS PROTOCOLS
  27.  
  28.   DA/2 supports the following communication protocols:
  29.  
  30.   o   Advanced program-to-program communication (APPC)
  31.       -   OS/2 to OS/2
  32.       -   OS/2 to IMS
  33.       -   OS/2 to CICS/MVS
  34.       -   OS/2 to user written platforms
  35.   o   NetBIOS
  36.       -   IBM and Novel(**) networks
  37.   o   OS/2 named pipes
  38.  
  39.   By supporting multiple protocols, Distributed Application/2 API's can be used
  40.   to communicate between two processes in an application, two modules across a
  41.   network, or within a process on a single machine.  You choose the protocol
  42.   you wish to use for each communication conversation at run-time without
  43.   changing or recompiling your code.
  44.  
  45.   You can also use Distributed Application/2 to:
  46.  
  47.   o   Communicate with the native advanced program-to-program communication
  48.       (APPC) calls supported by the Information Management System (IMS) version
  49.       4.1 or IMS version 3 using the LU 6.1/LU 6.2 adapter for applications on
  50.       an MVS host system.
  51.  
  52.   o   Communicate with Customer Information Control System/MVS (CICS/MVS) or
  53.       Customer Information Control System/ESA (CICS/ESA) applications that do
  54.       not use CICS 3270 maps. This is accomplished with the use of a CICS
  55.       Access Tool that is provided with Distributed Application/2.
  56.       Communications with the Distributed Application/2 CICS Access Tool is
  57.       accomplished with a simple set of character string instructions.
  58.  
  59.   ---------------
  60.  
  61.   (*) IBM, Operating System/2, and OS/2 are trademarks of the IBM Corporation
  62.       in the United States and other countries.
  63.  
  64.   (**) Novell is a trademark of Novell, Inc.
  65.   IBM
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.   o   Communicate with user written native advanced program-to-program communi-
  76.       cation (APPC) applications on other platforms.
  77.  
  78.  
  79.   SUPPORTED LANGUAGES
  80.  
  81.   Programmers have the flexibility to write distributed applications in mul-
  82.   tiple programming languages.  The supported programming languages are:
  83.  
  84.   o   32 bit C
  85.   o   REXX
  86.   o   Any other language that can call 32 bit C functions
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.   IBM
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.   MAJOR BENEFITS
  142.   ______________
  143.  
  144.   o   It is simple, easy to learn but powerful.  The API's are simple but they
  145.       also include features specifically designed to make synchronization
  146.       between components easier.
  147.  
  148.   o   API's hide the complexity of the supported communications protocols so
  149.       that the programmer only needs to focus on the programming interface.
  150.  
  151.   o   You select the communication protocol at run-time without changing or
  152.       recompiling your code.
  153.  
  154.   o   Because Distributed Application/2 totally hides the communication proto-
  155.       cols to the application, programmers can develop and test distributed
  156.       applications in a single machine.  They can then distribute them to the
  157.       final running machines without program modifications.
  158.  
  159.  
  160.   MAJOR FUNCTIONS OF DISTRIBUTED APPLICATION/2
  161.   ____________________________________________
  162.  
  163.   o   Transfers data with the concepts of OPEN, WRITE, READ, and CLOSE
  164.  
  165.       -   Interfaces are the same for all communication protocols
  166.       -   READ and WRITE API's are asynchronous
  167.  
  168.   o   One server can manage concurrent conversations with multiple clients
  169.  
  170.   o   Full duplex communications between OS/2 client/server
  171.  
  172.   o   C and REXX languages are supported.
  173.  
  174.   o   Multiple IPC and network protocols are supported
  175.  
  176.   o   Communication protocol is selected at run time
  177.  
  178.   o   Connection definition tool exploits CUA '91 interfaces
  179.  
  180.   o   Reentrant programming allows concurrent clients
  181.  
  182.   o   Easy to use, graphical installation procedure.
  183.  
  184.   o   Extensive online guide and reference documentation.
  185.  
  186.   o   Easy to imbed DA/2 into your application.
  187.  
  188.       -   Customizable online help.
  189.       -   Runtime module rename utility
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.   IBM
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.   SIMPLE CLIENT/SERVER COMMUNICATION TASKS
  210.   ________________________________________
  211.  
  212.   A distributed application consists of two or more programs that share data by
  213.   communicating with one another, usually across a network.
  214.  
  215.   For two programs to communicate, they must perform four basic communication
  216.   tasks. Each of these functions is provided by one of the Distributed
  217.   Application/2 API's:
  218.  
  219.  
  220.   +--------------------------------------------------+------------------------+
  221.   | TASK                                             |           API          |
  222.   +--------------------------------------------------+------------------------+
  223.   | Open a new communication channel between the two |         DAOpen         |
  224.   | programs.                                        |                        |
  225.   +--------------------------------------------------+------------------------+
  226.   | Close the channel, terminating communication     |         DAClose        |
  227.   | between the two programs.                        |                        |
  228.   +--------------------------------------------------+------------------------+
  229.   | Receive data sent by the communication partner.  |         DARead         |
  230.   |                                                  |                        |
  231.   +--------------------------------------------------+------------------------+
  232.   | Send data to the communication partner.          |         DAWrite        |
  233.   |                                                  |                        |
  234.   +--------------------------------------------------+------------------------+
  235.  
  236.  
  237.   USAGE
  238.   _____
  239.  
  240.   After installing Distributed Application/2, you write a client or server
  241.   application program using the DA/2 API's.  The server program may already
  242.   exist if you are communicating with an existing application using native
  243.   APPC, the IMS adapter or the CICS Access Tool.
  244.  
  245.   Next, you choose and configure the communication protocol using the DA/2 con-
  246.   nection definition tool (see later section).  After testing the application,
  247.   you package it together with the DA/2 runtime modules, connection definition,
  248.   and deliver it to your end-users.
  249.  
  250.  
  251.   EXAMPLE OF THE FLOW OF A SIMPLE CLIENT / SERVER USING DISTRIBUTED
  252.   APPLICATION/2
  253.  
  254.   1.  The client application establishes a connection to the server by issuing
  255.       the DAOpen API with the DA_INIT option as a parameter.  The connection
  256.       name should match with the symbolic name of the connection profile.
  257.  
  258.   2.  The server program in the server machine can then accept the connection
  259.       by issuing the DAOpen API with DA_ACCEPT as the option.
  260.  
  261.   3.  After successful connection the client application can send data to the
  262.       server application by issuing the DAWrite call. The data can then be
  263.       received by the server using the DARead API.
  264.  
  265.  
  266.  
  267.   IBM
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.   4.  After the server program obtains some data, the client and server appli-
  278.       cation can exchange the information by issuing the DAWrite and DARead
  279.       API's.
  280.  
  281.   5.  When there is no more need to communicate, the client and server can
  282.       close the connection with the DAClose API.
  283.  
  284.   Many times a program needs to handle communication asynchronously--that is,
  285.   with the ability to continue processing while waiting for a communication
  286.   request to complete. Distributed Application/2 provides asynchronous communi-
  287.   cation through the DA_NOWAIT option in the DARead API.
  288.  
  289.  
  290.   SERVER COMMUNICATING WITH MULTIPLE CLIENTS
  291.  
  292.   Distributed Application/2 provides a set of API's which will allow a single
  293.   instance of a server program to manage connection and data events coming from
  294.   multiple clients.  They are:
  295.  
  296.   +------------------------+--------------------------------------------------+
  297.   |           API          | DESCRIPTION                                      |
  298.   +------------------------+--------------------------------------------------+
  299.   |   DAIdentifyResource   | Instructs Distributed Application/2 to associate |
  300.   |                        | the calling process with a symbolic name         |
  301.   +------------------------+--------------------------------------------------+
  302.   |      DAWaitOnEvent     | Instructs Distributed Application/2 to notify    |
  303.   |                        | the calling program of any events intended fr    |
  304.   |                        | it.                                              |
  305.   +------------------------+--------------------------------------------------+
  306.   |   DATerminateResource  | Instructs Distributed Application/2 to discon-   |
  307.   |                        | tinue notification of events intended for        |
  308.   |                        | thespecified symbolic name                       |
  309.   +------------------------+--------------------------------------------------+
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.   IBM
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.   CUSTOMIZING THE CONNECTION PROFILES OF DISTRIBUTED APPLICATION/2
  344.   ________________________________________________________________
  345.  
  346.  
  347.   THE CONNECTION PROFILES
  348.  
  349.   When two applications are to communicate to each other, a connection name is
  350.   referenced during run time for the type of communication protocol and other
  351.   related parameters to be used. The connection name information is kept in
  352.   connection profiles.  These profiles are stored in a file called IBMDABB.CP.
  353.  
  354.   The profile provides Distributed Application/2 with the details of how to
  355.   open the connection.  When a new connection is opened, Distributed
  356.   Application/2 checks the connection profile for the specified destination to
  357.   determine:
  358.  
  359.   o   Which protocol to use
  360.  
  361.   o   Where the destination program is located
  362.  
  363.   o   How to start
  364.  
  365.   The connection profile also contains protocol-specific information for the
  366.   protocol to be used.
  367.  
  368.   The connection profile can be shared between the client (initiator) and the
  369.   server (acceptor) by putting it on a LAN server. This will ensure that both
  370.   sides are using the correct information for each connection.
  371.  
  372.  
  373.   CUSTOMIZING THE CONNECTION PROFILE
  374.  
  375.   The connection profile editor is a tool that creates, changes, or deletes
  376.   information in the connection profile.
  377.  
  378.   If you open the connection profile with the Connection Profile Editor, you
  379.   can customize the settings (see figures 1, 2, 3, and 4).
  380.  
  381.   -----------------------------------------------------------------------------
  382.  
  383.  
  384.   -----------------------------------------------------------------------------
  385.   Figure 1. Connection Profile Editor - Common Settings
  386.  
  387.   Common information must be filled in for any protocol used.  The required
  388.   information includes the following:
  389.  
  390.   SYMBOLIC NAME             Symbolic name of the destination of this con-
  391.                             nection. This is the name the client will use to
  392.                             identify the server in the DAOpen API.
  393.  
  394.   COMMUNICATION PROTOCOL    Selection of the communication protocol to be used
  395.                             for this connection.
  396.  
  397.  
  398.  
  399.  
  400.   IBM
  401.  
  402.  
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410.   SECURITY                  If UPM is chosen, Distributed Application/2 will
  411.                             use User Profile Management to make sure the user
  412.                             is logged on before connection is made. Security is
  413.                             performed differently for each protocol.
  414.  
  415.   TIME OUT                  Number of milliseconds to wait for the connection
  416.                             to be opened before there is a timeout error.
  417.  
  418.  
  419.  
  420.  
  421.  
  422.  
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.   IBM
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473.  
  474.  
  475.  
  476.   -----------------------------------------------------------------------------
  477.  
  478.  
  479.   -----------------------------------------------------------------------------
  480.   Figure 2. Connection Profile Editor - Named Pipes/NetBIOS settings
  481.  
  482.   NetBIOS or Named Pipes information is entered on this page of the connection
  483.   profile. If Named Pipes was the protocol selected on the common page, certain
  484.   fields would not be active for input.  The required information for NetBIOS
  485.   or Named Pipes includes the following:
  486.  
  487.   NETBIOS SERVER MACHINE        The name of the server machine that the server
  488.                                 application is residing on.
  489.  
  490.   NETBIOS MAXIMUM SESSIONS      The maximum number of sessions that will be
  491.                                 accepted.
  492.  
  493.   PROGRAM NAME                  The name and extension of the server program to
  494.                                 be run.
  495.  
  496.   PROGRAM PARAMETERS            Any parameters to pass to the server program.
  497.  
  498.   PROGRAM OPERATING MODE        Select foreground or background for program
  499.                                 operation field.
  500.  
  501.   PROGRAM TYPE                  Select queued or non-queued for the server
  502.                                 type.
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.   IBM
  533.  
  534.  
  535.  
  536.  
  537.  
  538.  
  539.  
  540.  
  541.  
  542.   -----------------------------------------------------------------------------
  543.  
  544.  
  545.   -----------------------------------------------------------------------------
  546.   Figure 3. Connection Profile Editor - APPC settings page 1 of 2.
  547.  
  548.   The first page of the APPC information in the connection profile is the fol-
  549.   lowing:
  550.  
  551.   TP NAME                  The name of the Transaction Program that will be
  552.                            used in the server machine.
  553.  
  554.   SNA MODE NAME            SNA mode name to be used in the APPC connection.
  555.  
  556.   LOCAL LU IDENTIFIER      Choose whether a local LU alias is to be used or a
  557.                            local LU pool.
  558.  
  559.   PLU IDENTIFIER           Choose whether a PLU alias name is to be used or a
  560.                            fully qualified PLU name.
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.  
  568.  
  569.  
  570.  
  571.  
  572.  
  573.  
  574.  
  575.  
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.  
  596.  
  597.  
  598.   IBM
  599.  
  600.  
  601.  
  602.  
  603.  
  604.  
  605.  
  606.  
  607.  
  608.   -----------------------------------------------------------------------------
  609.  
  610.  
  611.   -----------------------------------------------------------------------------
  612.   Figure 4. Connection Profile Editor - APPC settings page 2 of 2.
  613.  
  614.   The second page of the APPC information is the following:
  615.  
  616.   PARTNER TYPE             Choose partner type to be one of the following
  617.  
  618.                            o   Application specific - both the client and
  619.                                server programs are written using Distributed
  620.                                Application/2
  621.                            o   Native APPC with No confirmation - if the server
  622.                                program is native APPC program that does not use
  623.                                confirmations.
  624.                            o   Native APPC with Confirmation - if the server
  625.                                program is native APPC program that uses confir-
  626.                                mations.
  627.  
  628.   DATA CONVERSION          Specify whether Distributed Application/2 should
  629.                            perform the character conversion or not.
  630.  
  631.   MILLISECONDS             Milliseconds in send state while in idle
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.   IBM
  665.  
  666.  
  667.  
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674.   SAMPLE APPLICATION USING DISTRIBUTED APPLICATION/2
  675.   __________________________________________________
  676.  
  677.   There are two C programs listed.  One is the client program, the othe the
  678.   server.  By creating an appropriate connection profile the client program can
  679.   communicate with the server program.  (NOTE: The sample code is provided to
  680.   you solely for the purpose of assisting you in understanding the usage of
  681.   Distributed Application/2 Some of the function calls have no supporting code.
  682.   Below is an example:
  683.  
  684.   The brief program logic is as follows:
  685.  
  686.   1.  The client program, when started will ask the user to input the con-
  687.       nection name to be made.  Once the client obtains a valid conneciton name
  688.       it will initiate the connection by issuing the DAOpen call with DA_INIT
  689.       as the option.
  690.  
  691.   2.  Distributed Application/2 will search through the connection profiles to
  692.       get the detail information(e.g. protocols used, server program location,
  693.       etc.) from the connection profile matching the symbolic name that was
  694.       input by the user.
  695.  
  696.   3.  If at this time the server located in the server machine is not yet
  697.       started, it will be started according to the information put into the
  698.       connection profile(for NetBIOS and named pipes) or the TP definition in
  699.       the server machine (for APPC).
  700.  
  701.   4.  When the server is started it will first initialize itself and then issue
  702.       a DAIdentifyResource call to identify itself as one of the resources for
  703.       Distributed Application/2. After this it will go into an infinate loop
  704.       waiting to receive any event.
  705.  
  706.   5.  When the server receives a DAOpen request from a client it will issue a
  707.       DAOpen with DA_ACCEPT as the option to establish the connection.  Muliple
  708.       clients can send a request to the server machine.
  709.  
  710.   6.  After the connection is made the client will enter a loop asking the user
  711.       to input a customer name. The customer name obtained will be sent to the
  712.       server using the DAWrite API. The server searchs the database for the
  713.       "balance" corresponding to that customer.
  714.  
  715.   7.  The server returns the requested "balance" to the client program also
  716.       using the DAWrite API.
  717.  
  718.   8.  The client receives the "balance" information with DARead.
  719.  
  720.   9.  If the client application receives  an "END" from the user, it will send
  721.       the command to the server and close the connection using DAClose.  The
  722.       server will also issue a DAClose to close the connection with the
  723.       requesting client.
  724.  
  725.   10. If the client receives a "SERVEREXIT" from the user, it will send the
  726.       command to the server and close the connection using DAClose.  The server
  727.       will also issue a DAClose to close the connection and then issue a
  728.       DATerminateResource to shutdown and end itself.
  729.  
  730.  
  731.   IBM
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740.  
  741.   HEADER.H
  742.   ________
  743.  
  744.        1 /***************************************************************************/
  745.        2 /* HEADER.H                                                                */
  746.        3 /* Constants defined for use in the sample CLIENT and SERVER programs.     */
  747.        4 /***************************************************************************/
  748.        5 #define READ_BUF_SIZE  30                   /* Maximum buffer size for     */
  749.        6                                             /* DARead                      */
  750.        7 #define CUST_INFO      30                   /* Customer info buffer size   */
  751.        8 #define NAME_SIZE       8                   /* Size of the connection name */
  752.  
  753.  
  754.  
  755.  
  756.  
  757.  
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.  
  797.  
  798.   IBM
  799.  
  800.  
  801.  
  802.  
  803.  
  804.  
  805.  
  806.  
  807.  
  808.   CLIENT.C
  809.   ________
  810.  
  811.        1 /***************************************************************************/
  812.        2 /* CLIENT.C                                                                */
  813.        3 /* Sample Client program.                                                  */
  814.        4 /***************************************************************************/
  815.        5 #include <os2.h>
  816.        6 #include <stdio.h>
  817.        7 #include <stdlib.h>
  818.        8 #include <string.h>
  819.        9 #include "header.h"
  820.       10 #include "epfocrw.h"
  821.       11
  822.       12 USHORT ReadUserInput(PCHAR, USHORT);        /* Reads user input to buffer   */
  823.       13
  824.       14 INT main(VOID)
  825.       15 {
  826.       16   CHAR     ConnectionName[NAME_SIZE+1];     /* Symbolic name for Connection */
  827.       17                                             /* Must match with Connection   */
  828.       18                                             /* Profile.                     */
  829.       19   CHAR     CustomerBalance[CUST_INFO+1];    /* Balance to be returned       */
  830.       20   CHAR     CustomerName[CUST_INFO+1];       /* Name of customer to search   */
  831.       21   LHANDLE  hConnection;                     /* Handle of the connection     */
  832.       22   ULONG    ulReadBuffersize= READ_BUF_SIZE; /* Read buffer for DARead       */
  833.       23   USHORT   usWriteOptions, usReadOptions;   /* Options for DAWrite, DARead  */
  834.       24                                             /* and DAWaitOnEvent            */
  835.       25   USHORT   usRC;                            /* return code                  */
  836.       26   ULONG    ulBytesRead;                     /* Length of data in buffer     */
  837.       27   ULONG    ulRespID;                        /* Response ID                  */
  838.       28   ULONG    ulDataStatus, ulConnStatus;      /* Status of: DAWaitonEvent     */
  839.       29   DAFEEDBACK DAFeedBack;                    /* Feed Back structure          */
  840.       30
  841.       31   /**************************************************************************/
  842.       32   /* Establish connection to the server.                                    */
  843.       33   /* 1) Request User to input the connection name as it is in the           */
  844.       34   /*    Connection profile.                                                 */
  845.       35   /* 2) Establish the connection with the server using DAOpen.              */
  846.       36   /**************************************************************************/
  847.       37   While ( NoConnection )
  848.       38   {
  849.       39     memset( ConnectionName, '/0', sizeof(ConnectionName) );
  850.       40     printf("\nPlease enter the connection name: ");
  851.       41
  852.       42     /************************************************************************/
  853.       43     /* ReadUserInput would read the users typed in response to the          */
  854.       44     /* connection prompt. The functions parameters are as follows:          */
  855.       45     /*  1st parameter - PCHAR  - : connection name input by user            */
  856.       46     /*  2nd parameter - USHORT - : maximum number of characters allowed     */
  857.       47     /*                             for the connection name                  */
  858.       48     /*  Return code   - 0 on successful completion.                         */
  859.       49     /*  NOTE: This function is not coded in this example.                   */
  860.       50     /************************************************************************/
  861.       51     usRC = 0;
  862.       52     usRC = ReadUserInput(ConnectionName, NAME_SIZE);
  863.       53
  864.       54     if (usRC != 0)
  865.   IBM
  866.  
  867.  
  868.  
  869.  
  870.  
  871.  
  872.  
  873.  
  874.  
  875.       55       printf("\nConnection name in error.");
  876.       56     else if ( strcmp(ConnectionName, "EXIT") == 0 )
  877.       57     {
  878.       58       printf("\nReceived request for EXIT. Connection not made.");
  879.       59       exit (1);
  880.       60     }
  881.       61     else
  882.       62     {
  883.       63       hConnection = (LHANDLE)0;
  884.       64                                           /* (O) == Output, (I) == Input    */
  885.       65       DAOpen( &hConnection,               /* (O), communications handle     */
  886.       66               ConnectionName,             /* (I), logical connection name   */
  887.       67               DA_INIT,                    /* (I), DA_INIT or DA_ACCEPT      */
  888.       68               &DAFeedBack );              /* (O), error information         */
  889.       69
  890.       70       if ( DAFeedBack.MsgNo != RETURN_CODE_OK )
  891.       71         printf("\nConnection Error. Please input connection name again.");
  892.       72       else NoConnection = FALSE;
  893.       73     }
  894.       74   }
  895.       75
  896.       76   /**************************************************************************/
  897.       77   /* Continuous Loop does the following:                                    */
  898.       78   /*   1) Prompts user for customer name.                                   */
  899.       79   /*   2) Check Customer input for commands:                                */
  900.       80   /*      a) Customer name - Name of customer for server to query.          */
  901.       81   /*      b) "END" - user request to end the connection. Client stopped.    */
  902.       82   /*      c) "SERVEREXIT" - user request to stop server and client.         */
  903.       83   /*   3) Send the customer name to the server with DAWrite.                */
  904.       84   /*   4) Wait for server to return the "balance" for the customer. The     */
  905.       85   /*      DARead used in this example uses the DA_WAIT option. This causes  */
  906.       86   /*      the program to wait indefinately for the reply from the server.   */
  907.       87   /*      Using the DA_NOWAIT option would provide aysnchronous execution.  */
  908.       88   /**************************************************************************/
  909.       89   While (TRUE)
  910.       90   {
  911.       91     printf("\nEnter the name of the customer for balance information: ");
  912.       92     usRC = 0;
  913.       93     memset( CustomerName, '/0', sizeof(CustomerName) );
  914.       94     usRC = ReadUserInput(CustomerName, CUST_INFO);
  915.       95
  916.       96     if (usRC != 0)
  917.       97       printf("\nCustomer Name in error.");
  918.       98     else
  919.       99     {
  920.      100       usWriteOptions = DA_WRITE_DATA;
  921.      101                                           /* (O) == Output, (I) == Input    */
  922.      102       DAWrite( hConnection,               /* (I), communications handle     */
  923.      103                CustomerName,              /* (I), data area to be written   */
  924.      104                strlen(CustomerName),      /* (I), length of write buffer.   */
  925.      105                usWriteOptions,            /* (I), write options:            */
  926.      106                                           /*      DA_WRITE_DATA,            */
  927.      107                                           /*      DA_WRITE_ERROR,           */
  928.      108                                           /*      DA_WRITE_CONFIRMED,       */
  929.      109                                           /*      DA_RSVP, or DA_HOLD.      */
  930.      110                 &ulRespID,                /* (I/O), response ID             */
  931.   IBM
  932.  
  933.  
  934.  
  935.  
  936.  
  937.  
  938.  
  939.  
  940.  
  941.      111                 &DAFeedBack );            /* (O), error information         */
  942.      112
  943.      113       if ( DAFeedBack.MsgNo != RETURN_CODE_OK )
  944.      114         printf("\nError while writing information.");
  945.      115       else if ( strcmp(CustomerName, "SERVEREXIT") == 0 )
  946.      116       {
  947.      117         printf("\nSERVEREXIT received.");
  948.      118         DAClose = hConnection, &DAFeedBack);
  949.      119         printf("\nConnection closed. Request sent to server.");
  950.      120         exit (1);
  951.      121       }
  952.      122       else if ( strcmp(CustomerName, "END") == 0 )
  953.      123       {
  954.      124         DAClose = hConnection, &DAFeedBack);
  955.      125         printf("\nEND received. Connection closed.");
  956.      126         exit (1);
  957.      127       }
  958.      128       else
  959.      129       {
  960.      130         usReadOptions = DA_WAIT;
  961.      131                                           /* (O) == Output, (I) == Input    */
  962.      132         DARead( hConnection,              /* (I), communications handle     */
  963.      133                 CustomerBalance,          /* (O), received data goes here   */
  964.      134                 ulReadBuffer,             /* (I), length of buffer area.    */
  965.      135                 usReadOptions,            /* (I), read options:             */
  966.      136                                           /*      DA_WAIT or DA_NOWAIT      */
  967.      137                 &ulRespID,                /* (I/O), response ID             */
  968.      138                 &ulBytesRead,             /* (O), number of bytes returned  */
  969.      139                 &ulDataStatus,            /* (O), data status info:         */
  970.      140                                           /*      DA_NONE, DA_COMPLETE, or  */
  971.      141                                           /*      DA_INCOMPLETE             */
  972.      142                 &ulConnectionStatus,      /* (O), connection status info:   */
  973.      143                                           /*      DA_NONE, DA_CLOSE,        */
  974.      144                                           /*      DA_WRITE, DA_ERROR,       */
  975.      145                                           /*      DA_CONFIRM_WRITE, or      */
  976.      146                                           /*      DA_CONFIRM_CLOSE          */
  977.      147                 &DAFeedBack );            /* (O), error information         */
  978.      148
  979.      149         if ( DAFeedBack.MsgNo != RETURN_CODE_OK )
  980.      150           printf("\nError while reading information.");
  981.      151         else
  982.      152           printf("\nBalance for %s was %s", CustomerName, CustomerBalance);
  983.      153       }
  984.      154     }
  985.      155   }
  986.      156
  987.      157 }  /* End of Sample Client Program */
  988.  
  989.  
  990.  
  991.  
  992.  
  993.  
  994.  
  995.  
  996.  
  997.   IBM
  998.  
  999.  
  1000.  
  1001.  
  1002.  
  1003.  
  1004.  
  1005.  
  1006.  
  1007.   SERVER.C
  1008.   ________
  1009.  
  1010.        1 /***************************************************************************/
  1011.        2 /* SERVER.H                                                                */
  1012.        3 /* Sample Server Program.                                                  */
  1013.        4 /***************************************************************************/
  1014.        5 #include <os2.h>
  1015.        6 #include <stdio.h>
  1016.        7 #include <stdlib.h>
  1017.        8 #include <string.h>
  1018.        9 #include "header.h"
  1019.       10 #include "epfocrw.h"
  1020.       11
  1021.       12 VOID GetInfo(PCHAR, PCHAR, PCHAR);          /* Function to get balance      */
  1022.       13
  1023.       14 INT main(INT argc, PCHAR argv[])
  1024.       15 {
  1025.       16   CHAR     ConnectionName[NAME_SIZE+1];     /* Symbolic name for Connection */
  1026.       17                                             /* Should match with Connection */
  1027.       18                                             /* Profile.                     */
  1028.       19   CHAR     CustomerBalance[CUST_INFO+1];    /* Balance to be returned       */
  1029.       20   CHAR     CustomerName[CUST_INFO+1];       /* Name of customer to search   */
  1030.       21   CHAR     ReadBuffer[READ_BUF_SIZE+1];     /* Buffer for DARead call       */
  1031.       22   LHANDLE  hConnection;                     /* Handle of the connection     */
  1032.       23   ULONG    ulReadBuffersize= READ_BUF_SIZE; /* Read buffer for DARead       */
  1033.       24   USHORT   usWriteOptions, usReadOptions;   /* Options for DAWrite, DARead  */
  1034.       25                                             /* and DAWaitOnEvent            */
  1035.       26   USHORT   usWaitEventType, usWaitOptions;  /* Events types to be used by   */
  1036.       27                                             /* DAWaitOnEvent API.           */
  1037.       28   USHORT   usRC;                            /* return code                  */
  1038.       29   ULONG    ulBytesRead, ulDataLength;       /* Length of data in buffer     */
  1039.       30   ULONG    ulRespID;                        /* Response ID: not implemented */
  1040.       31   ULONG    ulDataStatus, ulConnStatus;      /* Status of: DAWaitonEvent     */
  1041.       32   DAFEEDBACK DAFeedBack;                    /* Feed Back structure          */
  1042.       33
  1043.       34   /**************************************************************************/
  1044.       35   /* Check the input argument for the connection name.                      */
  1045.       36   /**************************************************************************/
  1046.       37   if (argc != 2)
  1047.       38   {
  1048.       39     printf("\nConnection name required to start the server.Server stopped.");
  1049.       40     exit (1);
  1050.       41   }
  1051.       42   else if ( strlen(argv[1]) > NAME_SIZE )
  1052.       43   {
  1053.       44     printf("\nCorret connection name and try again. Server stopped.");
  1054.       45     exit (1);
  1055.       46   }
  1056.       47
  1057.       48   /**************************************************************************/
  1058.       49   /* Instruct Diestributed Application/2 to associate the sample program    */
  1059.       50   /* with the symbolic connection name from the argument.                   */
  1060.       51   /**************************************************************************/
  1061.       52   strcpy(ConnectionName, argv[1]);
  1062.       53   DAIdentifyResource(ConnectionName, &DAFeedBack);
  1063.       54   if ( DAFeedBack.MsgNo != RETURN_CODE_OK )
  1064.   IBM
  1065.  
  1066.  
  1067.  
  1068.  
  1069.  
  1070.  
  1071.  
  1072.  
  1073.  
  1074.       55   {
  1075.       56     printf("\nError occurred while identifying resource. Server stopped.");
  1076.       57     exit (1);
  1077.       58   }
  1078.       59   else
  1079.       60     printf("\nServer identified for connection: %s", ConnectionName);
  1080.       61
  1081.       62   /**************************************************************************/
  1082.       63   /* Enter infinate loop, wait for event to arrive and handle the request.  */
  1083.       64   /* The option, DA_ALL_EVENTS is used in the DAWaitOnEvent to cause the    */
  1084.       65   /* server to receive all events sent.                                     */
  1085.       66   /* Event type values for WaitOnEvent(.):                                  */
  1086.       67   /*    DA_CONNECTION  - an allocation event                                */
  1087.       68   /*    DA_DATA        - a data event not associated with a response ID.    */
  1088.       69   /*    DA_ID_DATA     - a data event assocated with a response ID.         */
  1089.       70   /*    DA_ALL_EVENTS  - all of the above three events.                     */
  1090.       71   /* Although this example uses the option DA_ALL_EVENTS, only DA_DATA      */
  1091.       72   /* and DA_CONNECTION are the only event types that are implemented here.  */
  1092.       73   /*                                                                        */
  1093.       74   /* The hConnection returned on DAWaitOnEvent will be different for each   */
  1094.       75   /* client connection.                                                     */
  1095.       76   /**************************************************************************/
  1096.       77   while (TRUE)
  1097.       78   {
  1098.       79     usWaitOptions = DA_ALL_EVENTS;
  1099.       80                                           /* (O) == Output, (I) == Input    */
  1100.       81     DAWaitOnEvent( ConnectionName,        /* (O), logical connection name   */
  1101.       82                    &hConnection,          /* (O), communications handle     */
  1102.       83                    usWaitOptions,         /* (I), events to wait on:        */
  1103.       84                                           /*      DA_DATA, DA_CONNECTION,   */
  1104.       85                                           /*      and/or DA_RESPONSE_DATA   */
  1105.       86                    &usWiatEventType,      /* (O), type of event returned:   */
  1106.       87                                           /*      DA_DATA, DA_CONNECTION,   */
  1107.       88                                           /*      or DA_RESPONSE_DATA       */
  1108.       89                    &ulDataLength,         /* (O), length (data event only)  */
  1109.       90                    &ulRespID,             /* (O), response ID (valid for    */
  1110.       91                                           /*      DA_RESPONSE_DATA event)   */
  1111.       92                    &DAFeedBack );         /* (O), error information         */
  1112.       93
  1113.       94     if ( DAFeedBack.MsgNo != RETURN_CODE_OK )
  1114.       95     {
  1115.       96       printf("\nError occurred while waiting for an event.");
  1116.       97       printf("\nServer is continuing to wait for events.");
  1117.       98     }
  1118.       99     else
  1119.      100     {
  1120.      101       /**********************************************************************/
  1121.      102       /* After event occurs, check the type of event.  This program only    */
  1122.      103       /* handles DA_CONNECTION (other events include:                       */
  1123.      104       /* and otherwise data is sent from the client. If CONNECTION is       */
  1124.      105       /* requested, issue a DAOpen with DA_ACCEPT to accept and establish   */
  1125.      106       /* a connection.                                                      */
  1126.      107       /**********************************************************************/
  1127.      108       if ( usWaitEventType == DA_CONNECTION )
  1128.      109       {
  1129.      110         DAOpen( &hConnection,
  1130.   IBM
  1131.  
  1132.  
  1133.  
  1134.  
  1135.  
  1136.  
  1137.  
  1138.  
  1139.  
  1140.      111                 ConnectionName,
  1141.      112                 DA_ACCEPT,
  1142.      113                 &DAFeedBack );
  1143.      114         if ( DAFeedBack.MsfNo != RETURN_CODE_OK )
  1144.      115         {
  1145.      116           printf("\nError occurred while accepting connection for: %s",
  1146.      117                     ConnectionName);
  1147.      118           printf("\nServer waiting for another event.");
  1148.      119         }
  1149.      120         else printf("\nConnection %s is made", ConnectionName);
  1150.      121       }
  1151.      122       else
  1152.      123       /**********************************************************************/
  1153.      124       /* If it is not a connection event, then data was sent by the         */
  1154.      125       /* client. Issue a DARead to read the data from the client. The       */
  1155.      126       /* client program does not send data which is associated with a       */
  1156.      127       /* response ID, so DA_RESPONSE_DATA is not implemented in the DARead  */
  1157.      128       /* example given here.                                                */
  1158.      129       /**********************************************************************/
  1159.      130       {
  1160.      131         memset( ReadBuffer, ' ', sizeof(ReadBuffer) );
  1161.      132         usReadOptions = DA_WAIT;
  1162.      133         ulRespID = 0;
  1163.      134         DARead( hConnection,
  1164.      135                 ReadBuffer,
  1165.      136                 ulReadBufferSize,
  1166.      137                 usReadOptions,
  1167.      138                 &ulRespID,
  1168.      139                 &ulBytesRead,
  1169.      140                 &ulDataStatus,
  1170.      141                 &ulConnectionStatus,
  1171.      142                 &DAFeedBack );
  1172.      143
  1173.      144         if ( DAFeedBack.MsgNo != RETURN_CODE_OK )
  1174.      145           printf("\nError occurred while accepting connection for: %s",
  1175.      146         else if ( strcmp(ReadBuffer, "SERVEREXIT") )
  1176.      147         {
  1177.      148           printf("\nSERVEREXIT received from client.");
  1178.      149           DAClose(hConnection, &DAFeedBack);
  1179.      150           printf("\nConnection ended and Server stopped.");
  1180.      151           DATerminateResource(arv[1], &DAFeedBack);
  1181.      152           exit (1);
  1182.      153         }
  1183.      154         else if ( strcmp(ReadBuffer, "END") )
  1184.      155         {
  1185.      156           printf("\nEND received from client");
  1186.      157           DAClose(hConnection, &DAFeedBack);
  1187.      158           printf("\nConnection %s ended", ConnectionName );
  1188.      159         }
  1189.      160         else
  1190.      161         {
  1191.      162           /******************************************************************/
  1192.      163           /* GetInfo function do the following:                             */
  1193.      164           /*   1) Extract the customer name from the read buffer.           */
  1194.      165           /*   2) Using the input customer name as the search data,         */
  1195.      166           /*      return the customers balance.                             */
  1196.   IBM
  1197.  
  1198.  
  1199.  
  1200.  
  1201.  
  1202.  
  1203.  
  1204.  
  1205.  
  1206.      167           /* NOTE: This function is not coded in this example.              */
  1207.      168           /******************************************************************/
  1208.      169           usRC = 0;
  1209.      170           usRC = GetInfo( ReadBuffer, CustomerName, CustomerBalance );
  1210.      171
  1211.      172           if (usRC != 0)
  1212.      173             printf("\nError processing customer name.");
  1213.      174           else
  1214.      175           {
  1215.      176             /****************************************************************/
  1216.      177             /* Send the customer balance information back to the client     */
  1217.      178             /* using the DAWrite API.                                       */
  1218.      179             /****************************************************************/
  1219.      180             usWriteOptions = DA_WRITE_DATA;
  1220.      181             ulRespID = 0;
  1221.      182             DAWrite( hConnection,
  1222.      183                      CustomerBalance,
  1223.      184                      strlen(CustomerBalance),
  1224.      185                      usWriteOptions,
  1225.      186                      &ulRespID,
  1226.      187                      &DAFeedBack );
  1227.      188             if ( DAFeedBack.MsgNo != RETURN_CODE_OK )
  1228.      189               printf("\nError while writing balance information for: %s"
  1229.      190                       CustomerName );
  1230.      191           }
  1231.      192         }
  1232.      193       }
  1233.      194     }
  1234.      195   }   /* End of Sample Server Program */
  1235.  
  1236.  
  1237.  
  1238.  
  1239.  
  1240.  
  1241.  
  1242.  
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258.  
  1259.  
  1260.  
  1261.  
  1262.   IBM
  1263.  
  1264.  
  1265.  
  1266.  
  1267.  
  1268.  
  1269.  
  1270.  
  1271.  
  1272.   OPERATING ENVIRONMENT FOR DISTRIBUTED APPLICATION/2
  1273.   ___________________________________________________
  1274.  
  1275.  
  1276.   MACHINE REQUIREMENTS
  1277.  
  1278.   o   A personal computer running OS/2 Version 2.0 or above.
  1279.  
  1280.       NOTE:  For more information on the OS/2 Version 2.0 or 2.1 machine
  1281.       requirements, refer to the IBM OS/2 Version 2.0 or 2.1 Information and
  1282.                                  ___________________________________________
  1283.       Planning Guide (G326-0160).
  1284.       ______________
  1285.  
  1286.   o   1 MB of hard disk space above that required by OS/2 Version 2.0 or 2.1.
  1287.  
  1288.   o   .5 MB of memory above that required by OS/2 Version 2.0 or 2.1.
  1289.  
  1290.   o   2-button mouse or other pointing device.
  1291.  
  1292.  
  1293.   PROGRAM REQUIREMENTS
  1294.  
  1295.   o   For IBM OS/2 2.0
  1296.  
  1297.       -   IBM OS/2 Version 2.0 operating system with ServicePak XR06055.
  1298.  
  1299.       -   IBM Developers Toolkit for OS/2 Version 2.0 for OS/2
  1300.  
  1301.   o   For IBM OS/2 2.1
  1302.  
  1303.       -   IBM OS/2 Version 2.1 operating system.
  1304.  
  1305.   o   To use Distributed Application/2 with NetBIOS, you need one of the
  1306.       following:
  1307.  
  1308.       -   The LAN Requester feature of OS/2 LAN Server Version 2.0 or LAN
  1309.           Server Version 3.0.  Any NetBIOS communication partners must also
  1310.           have an IBM LAN requester installed.
  1311.       -   Novell(**) NetWare(***) with the Novell NetBIOS emulator.  Any
  1312.           NetBIOS communication partners must also have the Novell NetWare
  1313.           requester installed.
  1314.  
  1315.   o   To use Distributed Application/2 with APPC, you also need Communication
  1316.       Manager/2 or IBM Extended Edition.
  1317.  
  1318.   o   To access CICS, you will need the following in your MVS host system:
  1319.  
  1320.       -   VTAM 3.2 or above
  1321.       -   CICS version 2.1.2 or above.
  1322.  
  1323.  
  1324.  
  1325.  
  1326.   ---------------
  1327.  
  1328.   (**) Novell is a trademark of Novell, Inc.
  1329.  
  1330.   (***) NetWare is a trademark of Novell, Inc.
  1331.   IBM
  1332.  
  1333.  
  1334.  
  1335.  
  1336.  
  1337.  
  1338.  
  1339.  
  1340.  
  1341.  
  1342.  
  1343.  
  1344.  
  1345.  
  1346.  
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352.  
  1353.  
  1354.  
  1355.  
  1356.  
  1357.  
  1358.  
  1359.  
  1360.  
  1361.  
  1362.  
  1363.  
  1364.  
  1365.  
  1366.  
  1367.  
  1368.  
  1369.  
  1370.  
  1371.  
  1372.  
  1373.  
  1374.  
  1375.  
  1376.  
  1377.  
  1378.  
  1379.  
  1380.  
  1381.  
  1382.  
  1383.  
  1384.  
  1385.  
  1386.  
  1387.  
  1388.  
  1389.  
  1390.  
  1391.  
  1392.  
  1393.  
  1394.  
  1395.  
  1396.  
  1397.   IBM
  1398.  
  1399.  
  1400.  
  1401.  
  1402.  
  1403.  
  1404.  
  1405.  
  1406.           +-------------------------------------------------------+
  1407.           |                   TABLE DEFINITIONS                   |
  1408.           +-------------------------------------------------------+
  1409.  
  1410.           ID      FILE                PAGE    REFERENCES
  1411.           __      ____                ____    __________
  1412.  
  1413.           BASIC   DA2LVL3 SCRIPT
  1414.                                       4            4
  1415.           ADVANCE DA2LVL3 SCRIPT
  1416.                                       5            5
  1417.  
  1418.  
  1419.  
  1420.           +-------------------------------------------------------+
  1421.           |                  PROCESSING OPTIONS                   |
  1422.           +-------------------------------------------------------+
  1423.  
  1424.  
  1425.           Runtime values:
  1426.                Document fileid ........................ DA2LVL3 SCRIPT
  1427.                Document type .......................... USERDOC
  1428.                Document style ......................... DEFAULT
  1429.                Profile ................................ EDFPRF30
  1430.                Service Level .......................... 0029
  1431.                SCRIPT/VS Release ...................... 4.0.0
  1432.                Date ................................... 94.02.16
  1433.                Time ................................... 15:47:46
  1434.                Device ................................. 3270
  1435.                Number of Passes ....................... 2
  1436.                Index .................................. NO
  1437.                SYSVAR S ............................... 1
  1438.  
  1439.  
  1440.           Formatting values used:
  1441.                Annotation ............................. NO
  1442.                Cross reference listing ................ YES
  1443.                Cross reference head prefix only ....... NO
  1444.                Dialog ................................. LABEL
  1445.                Duplex ................................. YES
  1446.                DVCF conditions file ................... (none)
  1447.                DVCF value 1 ........................... (none)
  1448.                DVCF value 2 ........................... (none)
  1449.                DVCF value 3 ........................... (none)
  1450.                DVCF value 4 ........................... (none)
  1451.                DVCF value 5 ........................... (none)
  1452.                DVCF value 6 ........................... (none)
  1453.                DVCF value 7 ........................... (none)
  1454.                DVCF value 8 ........................... (none)
  1455.                DVCF value 9 ........................... (none)
  1456.                Explode ................................ NO
  1457.                Figure list on new page ................ YES
  1458.                Figure/table number separation ......... YES
  1459.                Folio-by-chapter ....................... NO
  1460.                Head 0 body text ....................... (none)
  1461.                Head 1 body text ....................... (none)
  1462.                Head 1 appendix text ................... Appendix
  1463.                Hyphenation ............................ YES
  1464.                Justification .......................... NO
  1465.  
  1466.  
  1467.  
  1468.  
  1469.  
  1470.  
  1471.  
  1472.  
  1473.                Language ............................... ENGL
  1474.                Layout ................................. 1
  1475.                Leader dots ............................ NO
  1476.                Master index ........................... (none)
  1477.                Partial TOC (maximum level) ............ 4
  1478.                Partial TOC (new page after) ........... INLINE
  1479.                Print example id's ..................... NO
  1480.                Print cross reference page numbers ..... YES
  1481.                Process value .......................... (none)
  1482.                Punctuation move characters ............ .,
  1483.                Read cross-reference file .............. (none)
  1484.                Running heading/footing rule ........... NONE
  1485.                Show index entries ..................... NO
  1486.                Table of Contents (maximum level) ...... 3
  1487.                Table list on new page ................. YES
  1488.                Title page (draft) alignment ........... RIGHT
  1489.                Write cross-reference file ............. (none)
  1490.  
  1491.  
  1492.  
  1493.  
  1494.           +-------------------------------------------------------+
  1495.           |                      Imbed Trace                      |
  1496.           +-------------------------------------------------------+
  1497.  
  1498.  
  1499.           Page 12       SAMPLE
  1500.  
  1501.  
  1502.  
  1503.  
  1504.  
  1505.  
  1506.  
  1507.  
  1508.  
  1509.  
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515.  
  1516.  
  1517.  
  1518.  
  1519.  
  1520.  
  1521.  
  1522.  
  1523.  
  1524.  
  1525.  
  1526.  
  1527.  
  1528.  
  1529.  
  1530.  
  1531.  
  1532.  
  1533.  
  1534.  
  1535.  
  1536.  
  1537. STARTING PASS 2 OF 2.
  1538. TEXT EXCEEDS RIGHT PAGE BOUNDARY ON PAGE 12.
  1539. TEXT EXCEEDS RIGHT PAGE BOUNDARY ON PAGE 13.
  1540. TEXT EXCEEDS RIGHT PAGE BOUNDARY ON PAGE 14.
  1541. TEXT EXCEEDS RIGHT PAGE BOUNDARY ON PAGE 15.
  1542. TEXT EXCEEDS RIGHT PAGE BOUNDARY ON PAGE 16.
  1543. TEXT EXCEEDS RIGHT PAGE BOUNDARY ON PAGE 17.
  1544. TEXT EXCEEDS RIGHT PAGE BOUNDARY ON PAGE 18.
  1545. TEXT EXCEEDS RIGHT PAGE BOUNDARY ON PAGE 19.
  1546.  
  1547.  
  1548.  
  1549.  
  1550.  
  1551.  
  1552.  
  1553.  
  1554.  
  1555.  
  1556.  
  1557.  
  1558.  
  1559.  
  1560.  
  1561.  
  1562.  
  1563.  
  1564.  
  1565.  
  1566.  
  1567.  
  1568.  
  1569.  
  1570.  
  1571.  
  1572.  
  1573.  
  1574.  
  1575.  
  1576.  
  1577.  
  1578.  
  1579.  
  1580.  
  1581.  
  1582.  
  1583.  
  1584.  
  1585.  
  1586.  
  1587.  
  1588.  
  1589.  
  1590.  
  1591.  
  1592.  
  1593.  
  1594.  
  1595.  
  1596.  
  1597.  
  1598.  
  1599.  
  1600.