*DECK CMSELR
USETEXT COMCBEG 
USETEXT COMRQUE 
USETEXT COMRAPL 
USETEXT COMRNDR 
USETEXT COMRNET 
USETEXT COMRNAM 
USETEXT COMRRTN 
PROC CMSELR;
# TITLE  CMSELR - PROCESS CM/SEL/R SUPERVISORY MESSAGE. # 
  
      BEGIN  # CMSELR # 
  
# 
**    CMSELR - PROCESS CM/SEL/R SUPERVISORY MESSAGE.
* 
*     PROCESSES A CONVERT MODE SELECT REQUEST FROM A UCP. 
* 
*     PROC CMSELR.
* 
*     ENTRY   - APL$HEADER IS BASED ARRAY FOR APPL TABLE HEADER.
*               QU$ADDRESS IS BASED ARRAY FOR CM/SEL/R SUPR MSG.
*               CONNECTION IS BASED ARRAY FOR ACN.
* 
*     EXIT    - CM/SEL/R IS PROCESSED.
* 
*     PROCESS - IF CONNECTION HAS A CONVERT MODE ACTIVE 
                  OR INVALID CONVERT MODE TYPE
*               THEN
*                 QUEUE AN ERROR LOGICAL. 
*               ELSE
*                 GET CORRESPONDING LOCAL NAD ENTRY.
*                 IF NAD DOES NOT HAVE CODE CONVERSION
*                 THEN
*                   SEND CM/SEL/A WITH RC=1.
*                 ELSE
*                   IF NO CONVERT MODE PATHS AVAILABLE
*                   THEN
*                     SEND CM/SEL/A  WITH RC=2. 
*                   ELSE
*                     CREATE NDR SELECT CONVERT MODE REQUEST. 
*                     QUEUE REQUEST ON LOCAL NAD QUEUE. 
# 
  
# 
****  PROC CMSELR - XREF LIST BEGIN.
# 
  
      XREF
        BEGIN 
        PROC QERRLGL;                # QUEUE AN ERROR LOGICAL MESS. # 
        PROC FREE;                   # PLACE QUEUE ENTRY ON FREE Q #
        PROC QCMSELA;                # QUEUE A CM/SEL/A REPLY # 
        ITEM NADTBL I;               # FWA OF LOCAL NAD TABLE # 
        PROC RTNNSUP;                # REPLY TO UCP # 
        PROC GETFREE;                # GET QUEUE ENTRY FROM FREE Q #
        PROC NADREQ;                 # PLACE NDR REQUEST ON LNAD Q #
        END 
  
# 
****  PROC CMSELR - XREF LIST END.
# 
  
  
      ITEM CMTYPE     I;             # CONVERT MODE TYPE #
      ITEM ACN        I;             # APPLICATION CONNECTION NUMBER #
      ITEM QUEADR     I;             # QUEUE POINTER SAVE AREA #
  
CONTROL EJECT;
  
      IF CON$CM NE BINARY 
        OR QU$CMSELTY LE BINARY 
        OR QU$CMSELTY GE CMENTEXT 
      THEN
        BEGIN 
        QERRLGL(LGL$PROTCL,0,QU$UCPA,QU$BLKHDR,QU$SUPWD1,0,0);
        FREE; 
        END 
  
      ELSE
        BEGIN 
        P<PTH$ENTRY> = CON$PATHAD;
        P<NAD$ENTRY> = PTH$NADORD * NAD$LENGTH + NADTBL;
        QUEADR = P<QU$ADDRESS>; 
        CMTYPE = QU$CMSELTY;
        ACN = (P<CONNECTION> - P<APL$HEADER> - APL$LENGTH)
                     / CON$LENGTH + APL$MINACN; 
        IF NOT NAD$CME
        THEN
          BEGIN 
          QCMSELA(CMS$CMNE,ACN,CMTYPE); 
          P<QU$ADDRESS> = QUEADR; 
          RTNNSUP;
          END 
  
        ELSE
          BEGIN 
          IF NAD$CMPA EQ 0
          THEN
            BEGIN 
            QCMSELA(CMS$CMPNA,ACN,CMTYPE);
            P<QU$ADDRESS> = QUEADR; 
            RTNNSUP;
            END 
  
          ELSE
            BEGIN 
            NAD$CMPA = NAD$CMPA - 1;
            CON$CM = CMENTEXT;
            RTNNSUP;
            GETFREE;
            QU$TYPE = QT$CMSEL; 
            QU$APPL = P<APL$HEADER>;
            QU$ACN = ACN; 
            QU$PATHID = CON$PATHID; 
            QU$CMTYPE = CMTYPE; 
            NADREQ(PTH$NADORD); 
            END 
  
          END 
  
        END 
  
  
      END  # CMSELR # 
  
      TERM
