home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_C / CENVIW9.ZIP / SERVEOS2.CMM < prev    next >
Text File  |  1994-03-08  |  13KB  |  309 lines

  1. //************************************************************************
  2. //*** ServeOS2.cmm - Function to work with WIN_BOSS.LIB so that OS/2   ***
  3. //*** ver.1          can control a Windows session.  This program must ***
  4. //***                be executed by CEnvi for Windows.  A lot of       ***
  5. //***                execution time can be saved by /BINDing first.    ***
  6. //************************************************************************
  7.  
  8.  
  9. if !defined(_WINDOWS_) {
  10.    printf("\a\nTHIS PROGRAM MUST BE EXECUTED ONLY BY CENVI FOR WINDOWS\n");
  11.    Instructions();
  12. }
  13.  
  14. #include <OptParms.lib>
  15. #include <Message.lib>
  16. #include <WinTools.lib>
  17. #include <WinUtil.lib>
  18. #include <KeyPush.lib>
  19. #include <MenuCtrl.lib>
  20. #include <DlgCtrl.lib>
  21. #include <ClipBrd.lib>
  22.  
  23. #define DEFAULT_MESSAGE_WAIT  500   // time to wait between messages
  24. #define DEFAULT_PIPE_FILE_NAME  "ServeOS2"
  25.  
  26. Instructions()
  27. {
  28.    printf("\n")
  29.    printf("ServeOS2.cmm - Run Windows session under control of CEnvi WIN_BOSS script.\n")
  30.    printf("\n")
  31.    printf("SYNTAX: <path>\CEnvi ServeOS2 [options] [WinProgram args...]\n")
  32.    printf("\n")
  33.    printf("WHERE: path - Path to the Windows version of CEnvi\n")
  34.    printf("       WinProgram args...- Executable Windows program and parameters to that\n")
  35.    printf("                  program.  If supplied then ServeOS2.cmm will run until this\n")
  36.    printf("                  program is no longer running.\n")
  37.    printf("       options:\n");
  38.    printf("         /DELAY time: time (milliseconds) to delay between checks; default %d\n",DEFAULT_MESSAGE_WAIT)
  39.    printf("         /NAME: Unique 8.3 name to identify ServeOS2 session: default %s\n",DEFAULT_PIPE_FILE_NAME)
  40.    printf("\n")
  41.    printf("EXAMPLES: C:\\CENVIW\\CEnvi ServeOS2\n")
  42.    printf("          C:\\CENVIW\\CEnvi ServeOS2 /DELAY 1000 /NAME Slave.doo\n")
  43.    printf("          C:\\CENVIW\\CEnvi ServeOS2 /NAME NOTE Notepad.exe c:\\Autoexec.bat\n")
  44.    printf("\n")
  45.    if ( defined(_WINDOWS_) )
  46.       getch();
  47.    exit(EXIT_FAILURE);
  48. }
  49.  
  50. MessageWait = DEFAULT_MESSAGE_WAIT;   // time to wait between messages
  51. PFileName = DEFAULT_PIPE_FILE_NAME;
  52. ReceivedQuitCommand = False;
  53.  
  54. main(argc,argv)
  55. {
  56.    if ( argc == 2  && !strcmp(argv[1],"/?") )
  57.       Instructions();
  58.  
  59.    // get some of the optional parameters
  60.    if OptionalParameter(argc,argv,"DELAY",sParm)
  61.       MessageWait = atoi(sParm);
  62.    OptionalParameter(argc,argv,"NAME",PFileName);
  63.  
  64.    if ( 1 < argc ) {
  65.       // following parameters are for spawn, so build command and spawn
  66.       // application
  67.       for ( i = 1, ExecCmd = ""; i < argc; i++ ) {
  68.          strcat(ExecCmd,argv[i]);
  69.          strcat(ExecCmd," ");
  70.       }
  71.       ExecCmd[strlen(ExecCmd)-1] = 0;  // no extra blank at end
  72.       if ( !(MasterWindowHwnd = spawn(P_NOWAIT,ExecCmd)) ) {
  73.          printf("\a\nUNABLE TO EXECUTE \"%s\"\n",ExecCmd);
  74.          Instructions();
  75.       }
  76.    }
  77.    RetitleThisWindow();
  78.    HideThisWindow();
  79.    RunForever(MasterWindowHwnd);
  80.    return EXIT_SUCCESS;
  81. }
  82.  
  83. RetitleThisWindow()  // give this window the ServeOS2 name
  84. {
  85.    sprintf(NewTitle,"ServeOS2: %s",PFileName);
  86.    SetWindowTitle(ScreenHandle(),NewTitle);
  87. }
  88.  
  89. HideThisWindow()
  90. {
  91.    // set off the screen so it won't be seen
  92.    SetPosition(ScreenHandle(),-300,-300);
  93. }
  94.  
  95. #define NO_WAIT_FOR_RETURN    0
  96. #define WAIT_FOR_VOID_RETURN  1
  97. #define WAIT_FOR_RETURN       2
  98.  
  99. RunForever(MasterHwnd)
  100. {
  101.    sprintf(FullPipeSpec,"\\PIPE\\%s",PFileName);
  102.    while ( !ReceivedQuitCommand  &&  (!defined(MasterHwnd) || IsWindow(MasterHwnd)) ) {
  103.  
  104.       // try to read command from pipe file
  105.       if ( fp = fopen(FullPipeSpec,"r+b") ) {
  106.          // read integer for how many bytes in message
  107.          if ( fread(ReadCount,UWORD32,fp) ) {
  108.             undefine(lCommand);
  109.             if ( ReadCount == fread(lCommand,ReadCount,fp) ) {
  110.                rewind(fp);
  111.                lReturnCode = BLObGet(lCommand,0,SWORD32);
  112.                undefine(lResult);
  113.                if ( NO_WAIT_FOR_RETURN == lReturnCode ) {
  114.                   // return fwrite immediately
  115.                   BLObSize(lResult,1);
  116.                   fwrite(BLObSize(lResult),UWORD32,fp);
  117.                   fwrite(lResult,BLObSize(lResult),fp); 
  118.                   fclose(fp);
  119.                   fp = NULL;
  120.                }
  121.                ExecuteFunction(lCommand,lReturnCode,lResult);
  122.                if ( NO_WAIT_FOR_RETURN != lReturnCode ) {
  123.                   fwrite(BLObSize(lResult),UWORD32,fp);
  124.                   fwrite(lResult,BLObSize(lResult),fp);
  125.                }
  126.             }
  127.          }
  128.          if ( fp ) fclose(fp);
  129.       }
  130.  
  131.       suspend(MessageWait);
  132.    }
  133. }
  134.  
  135.  
  136. ExecuteFunction(pCmdBLOb,pReturnCode,pResultBLOb)
  137. {
  138.    lExpectReturn = (WAIT_FOR_RETURN == pReturnCode);
  139.  
  140.    // get function name
  141.    lNameSize = BLObGet(pCmdBLOb,lBLObOffset = 4,UWORD32);
  142.    lFuncName = BLObGet(pCmdBLOb,lBLObOffset += 4,lNameSize);
  143.    lBLObOffset += lNameSize;
  144.  
  145.    // get count for how many variable to send to function
  146.    lVarCount = BLObGet(pCmdBLOb,lBLObOffset,UWORD32);
  147.    lBLObOffset += 4;
  148.  
  149.    if ( lVarCount < 1 ) {
  150.     if ( lExpectReturn ) lRet = function(lFuncName);
  151.     else function(lFuncName);
  152.    } else {
  153.     lVar1 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  154.     if ( lVarCount < 2 ) {
  155.      if ( lExpectReturn ) lRet = function(lFuncName,lVar1);
  156.      else function(lFuncName,lVar1);
  157.     } else {
  158.      lVar2 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  159.      if ( lVarCount < 3 ) {
  160.       if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2);
  161.       else function(lFuncName,lVar1,lVar2);
  162.      } else {
  163.       lVar3 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  164.       if ( lVarCount < 4 ) {
  165.        if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3);
  166.        else function(lFuncName,lVar1,lVar2,lVar3);
  167.       } else {
  168.        lVar4 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  169.        if ( lVarCount < 5 ) {
  170.         if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3,lVar4);
  171.         else function(lFuncName,lVar1,lVar2,lVar3,lVar4);
  172.        } else {
  173.         lVar5 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  174.         if ( lVarCount < 6 ) {
  175.          if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5);
  176.          else function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5);
  177.         } else {
  178.          lVar6 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  179.          if ( lVarCount < 7 ) {
  180.           if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6);
  181.           else function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6);
  182.          } else {
  183.           lVar7 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  184.           if ( lVarCount < 8 ) {
  185.            if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7);
  186.            else function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7);
  187.           } else {
  188.            lVar8 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  189.            if ( lVarCount < 9 ) {
  190.             if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8);
  191.             else function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8);
  192.            } else {
  193.             lVar9 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  194.             if ( lVarCount < 10 ) {
  195.              if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9);
  196.              else function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9);
  197.             } else {
  198.              lVar10 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  199.              if ( lVarCount < 11 ) {
  200.               if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10);
  201.               else function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10);
  202.              } else {
  203.               lVar11 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  204.               if ( lVarCount < 12 ) {
  205.                if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10,lVar11);
  206.                else function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10,lVar11);
  207.               } else {
  208.                lVar12 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  209.                if ( lVarCount < 13 ) {
  210.                 if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10,lVar11,lVar12);
  211.                 else function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10,lVar11,lVar12);
  212.                } else {
  213.                 lVar13 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  214.                 if ( lVarCount < 14 ) {
  215.                  if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10,lVar11,lVar12,lVar13);
  216.                  else function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10,lVar11,lVar12,lVar13);
  217.                 } else {
  218.                  lVar14 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  219.                  if ( lVarCount < 15 ) {
  220.                   if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10,lVar11,lVar12,lVar13,lVar14);
  221.                   else function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10,lVar11,lVar12,lVar13,lVar14);
  222.                  } else {
  223.                   lVar15 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  224.                   if ( lVarCount < 16 ) {
  225.                    if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10,lVar11,lVar12,lVar13,lVar14,lVar15);
  226.                    else function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10,lVar11,lVar12,lVar13,lVar14,lVar15);
  227.                   } else {
  228.                    lVar16 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  229.                    if ( lVarCount < 17 ) {
  230.                     if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10,lVar11,lVar12,lVar13,lVar14,lVar15,lVar16);
  231.                     else function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10,lVar11,lVar12,lVar13,lVar14,lVar15,lVar16);
  232.                    } else {
  233.                     lVar17 = GetNextExecVar(pCmdBLOb,lBLObOffset);
  234.                     if ( lVarCount < 18 ) {
  235.                      if ( lExpectReturn ) lRet = function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10,lVar11,lVar12,lVar13,lVar14,lVar15,lVar16,lVar17);
  236.                      else function(lFuncName,lVar1,lVar2,lVar3,lVar4,lVar5,lVar6,lVar7,lVar8,lVar9,lVar10,lVar11,lVar12,lVar13,lVar14,lVar15,lVar16,lVar17);
  237.                     } else {
  238.                      printf("\aEEEEK! TOO MANY VARIABLES\n");
  239.                      getch();
  240.                      abort();
  241.                     }
  242.                    }
  243.                   }
  244.                  }
  245.                 }
  246.                }
  247.               }
  248.              }
  249.             }
  250.            }
  251.           }
  252.          }
  253.         }
  254.        }
  255.       }
  256.      }
  257.     }
  258.    }
  259.  
  260.    undefine(pResultBLOb);
  261.    if ( lExpectReturn ) {
  262.       if ( 1 == DataDimension(lRet) ) {
  263.          if ( CMM_BYTE != DataType(lRet) ) {
  264.             printf("\nServeOS2 arrays may only be byte-type and 1 dimensional.\a\n");
  265.             getch();
  266.             abort();
  267.          }
  268.          lVarLen = 1+GetArraySpan(lRet);
  269.          BLObPut(pResultBLOb,lVarLen,SWORD32);
  270.          BLObPut(pResultBLOb,lRet,lVarLen);
  271.       } else {
  272.          // convert return variable to blob to send back
  273.          lDataType = DataType(lRet);
  274.          BLObPut(pResultBLOb,-lDataType,SWORD32);
  275.          switch ( lDataType ) {
  276.             case CMM_BYTE:    BLObPut(pResultBLOb,lRet,UWORD8);   break;
  277.             case CMM_INT:     BLObPut(pResultBLOb,lRet,SWORD32);  break;
  278.             case CMM_FLOAT:   BLObPut(pResultBLOb,lRet,FLOAT64);  break;
  279.             default:
  280.                printf("\nServeOS2 data type must be byte, integer, or float.\n\a");
  281.                getch();
  282.                abort();
  283.          }
  284.       }
  285.    } else {
  286.       // simply return a byte to indicate that function is finished
  287.       BLObSize(pResultBLOb,1);
  288.    }
  289. }
  290.  
  291. GetNextExecVar(pBLOb,pOffset)
  292. {
  293.    switch ( lTypeOrLen = BLObGet(pBLOb,(pOffset += 4)-4,SWORD32) ) {
  294.       case (-CMM_BYTE):    lRet = BLObGet(pBLOb,pOffset,UWORD8);     pOffset++;              break;
  295.       case (-CMM_INT):     lRet = BLObGet(pBLOb,pOffset,SWORD32);    pOffset += 4;           break;
  296.       case (-CMM_FLOAT):   lRet = BLObGet(pBLOb,pOffset,FLOAT64);    pOffset += 8;           break;
  297.       default:             lRet = BLObGet(pBLOb,pOffset,lTypeOrLen); pOffset += lTypeOrLen;  break;
  298.    }
  299.    return lRet;
  300. }
  301.  
  302. // The following are all commands that might be called
  303.  
  304. ServeOS2Exit()
  305. {
  306.    ReceivedQuitCommand = True;
  307. }
  308.  
  309.