home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mandelc.zip / server.cpp < prev    next >
C/C++ Source or Header  |  1993-08-01  |  7KB  |  301 lines

  1. #include "server.h"
  2.  
  3.  
  4. serverMainThread::serverMainThread(serverProcess *pProcessNew)
  5.     :thread(FALSE, pProcessNew)
  6. {    pProcess = pProcessNew;
  7. }
  8.  
  9.  
  10. void serverMainThread::doSomething(void)
  11. {       serverThread *pThread;
  12.  
  13.     if (!(pThread = new serverThread(pProcess)))
  14.         return;
  15.     else
  16.         if (!pThread->isSuccessfull())
  17.         {    delete pThread;
  18.             return;
  19.         }
  20.     pThread->startThread();
  21.     while (1)
  22.         DosSleep(1000*60);
  23. }
  24.  
  25.  
  26. serverThread::serverThread(serverProcess *pProcessNew)
  27.     :thread(TRUE, pProcessNew)
  28. {    pProcess = pProcessNew;
  29. }
  30.  
  31.  
  32. Boolean serverThread::create(void)
  33. {    APIRET iRet;
  34.  
  35.     if (iRet = DosCreateNPipe((unsigned char*)pProcess->pPipeName,
  36.         &hPipe,
  37.         NP_NOWRITEBEHIND | NP_NOINHERIT | NP_ACCESS_DUPLEX,
  38.         NP_WAIT | NP_TYPE_MESSAGE | NP_READMODE_MESSAGE | NP_UNLIMITED_INSTANCES,
  39.         1024*16,
  40.        1024*16,
  41.        0))
  42.     {    fprintf(stderr,
  43.             "DosCreateNPipe() returned error code %u!\n",
  44.             iRet);
  45.         return FALSE;
  46.     }
  47.     DosSetPriority(PRTYS_THREAD,
  48.         PRTYC_IDLETIME,
  49.         -pTIB->tib_ptib2->tib2_ulpri,
  50.         pTIB->tib_ptib2->tib2_ultid);
  51.     return TRUE;
  52. }
  53.  
  54.  
  55. void serverThread::destruct(void)
  56. {    DosClose(hPipe);
  57. }
  58.  
  59.  
  60. Boolean serverThread::calculate(structRequest *pStructR)
  61. {    unsigned int iSize;
  62.     unsigned long iBytesWritten;
  63.     APIRET iRet;
  64.     unsigned char *paiData;
  65.  
  66.     if (pStructR->iSizeX > 16384)
  67.         return FALSE;
  68.     if (!(paiData
  69.         = (unsigned char*)alloca(iSize = pStructR->iSizeX*sizeof*paiData)))
  70.         return FALSE;
  71.     (*pFctCalculate)(
  72.         pStructR->iSizeX,
  73.         pStructR->iMaxColors,
  74.         pStructR->iMaxIterations,
  75.         paiData,
  76.         pStructR->dLimit,
  77.         pStructR->dXdx,
  78.         pStructR->dYdx,
  79.         pStructR->dXa,
  80.         pStructR->dYa);
  81.     if (iRet = DosWrite(hPipe, paiData, iSize, &iBytesWritten))
  82.     {    fprintf(stderr,
  83.             "DosRead() returned error code %u!\n",
  84.             iRet);
  85.         return FALSE;
  86.     }
  87.     if (iBytesWritten != iSize)
  88.     {    fprintf(stderr,
  89.             "Wrong number of bytes written (%u)!\n",
  90.             iBytesWritten);
  91.         return FALSE;
  92.     }
  93.     return TRUE;
  94. }
  95.  
  96.  
  97. void serverThread::doSomething(void)
  98. {       structRequest structR;
  99.     unsigned long iBytesRead;
  100.     unsigned int iRet;
  101.  
  102.     do
  103.     {    serverThread *pThread = new serverThread(pProcess);
  104.  
  105.         if (iRet = DosConnectNPipe(hPipe))
  106.         {    fprintf(stderr,
  107.                 "DosConnectNPipe() returned error code %u!\n",
  108.                 iRet);
  109.             continue;
  110.         }
  111.         if (pThread)
  112.             if (pThread->isSuccessfull())
  113.             {    pThread->startThread();
  114.                 break;
  115.             }
  116.             else
  117.             {    delete pThread;
  118.                 fprintf(stderr,
  119.                     "Could not successfull create thread!\n");
  120.                 if (iRet = DosDisConnectNPipe(hPipe))
  121.                     fprintf(stderr,
  122.                 "DosDisConnectNPipe() returned error code %u!\n",
  123.                         iRet);
  124.                 continue;
  125.             }        else
  126.         {    fprintf(stderr, "Could not create thread!\n");
  127.             if (iRet = DosDisConnectNPipe(hPipe))
  128.                 fprintf(stderr,
  129.             "DosDisConnectNPipe() returned error code %u!\n",
  130.                     iRet);            continue;
  131.         }
  132.     } while (1);
  133.     {    char acBuffer[1024];
  134.         unsigned long iBytes;
  135.         dLLName *pDLLName;
  136.  
  137.         if (DosRead(hPipe, acBuffer, sizeof acBuffer, &iBytes)
  138.             || iBytes < 2)
  139.         {    fprintf(stderr, "Could`t read dll name!");
  140.             if (iRet = DosDisConnectNPipe(hPipe))
  141.                 fprintf(stderr,
  142.                 "DosDisConnectNPipe() returned error code %u!\n",
  143.                     iRet);
  144.             return;        }
  145.         pDLLName = (dLLName*)acBuffer;
  146.         if (!pProcess->chainDLLNames.foreach(
  147.             idForeachDLLNameGetThisByDescription,
  148.             (void*)&pDLLName))
  149.         {    fprintf(stderr,
  150.                 "Could`t find matching DLL for description %s!\n",
  151.                 acBuffer);
  152.             if (iRet = DosDisConnectNPipe(hPipe))
  153.                 fprintf(stderr,
  154.                 "DosDisConnectNPipe() returned error code %u!\n",
  155.                     iRet);
  156.             return;        }
  157.         pFctCalculate = pDLLName->pFctCalculate;
  158.     }
  159.     while (!(iRet = DosRead(hPipe,
  160.         &structR,
  161.         sizeof structR,
  162.         &iBytesRead))
  163.         && iBytesRead == sizeof structR)
  164.         if (!calculate(&structR))
  165.             break;
  166.     if (iRet)
  167.         fprintf(stderr,
  168.             "DosRead() returned error code %u!\n",
  169.             iRet);
  170.     else
  171.         if (iBytesRead != sizeof structR)
  172.             fprintf(stderr,
  173.                 "Invalid number of bytes in request!\n");
  174.     if (iRet = DosDisConnectNPipe(hPipe))
  175.         fprintf(stderr,
  176.             "DosDisConnectNPipe() returned error code %u!\n",
  177.             iRet);
  178. }
  179.  
  180.  
  181. serverProcess::serverProcess(int argc, char **argv):process(argc, argv)
  182. {    if (argc == 3)
  183.         pPipeName = argv[2];
  184.     else
  185.     {    fprintf(stderr, "Usage: %s dllFile \\pipe\\myPipeName", argv[0]);
  186.         setNoSuccess();
  187.     }
  188. }
  189.  
  190.  
  191. Boolean serverProcess::create(void)
  192. {       {    FILE *pFile;
  193.         char acLine[1024];
  194.  
  195.         if (!(pFile = fopen(argv[1], "r")))
  196.         {    fprintf(stderr, "Cannot open %s!\n", argv[1]);
  197.             return FALSE;
  198.         }
  199.         acLine[sizeof acLine - 1] = 0;
  200.         while (fgets(acLine, sizeof acLine - 1, pFile))
  201.         {    dLLName *p;
  202.             char *pPos;
  203.  
  204.             if (pPos = strchr(acLine, '\n'))
  205.                 *pPos = 0;
  206.             if (p = new dLLName(acLine, &chainDLLNames))
  207.                 if (p->isSuccessfull())
  208.                     continue;
  209.                 else
  210.                     delete p;
  211.             fprintf(stderr, "Error loading DLL %s!\n", acLine);
  212.             return FALSE;
  213.         }
  214.         fclose(pFile);
  215.     }    if (!(pProcessThread = new serverMainThread(this)))
  216.         return FALSE;
  217.     else
  218.         if (pProcessThread->isSuccessfull())
  219.             return TRUE;
  220.         else
  221.         {    delete pProcessThread;
  222.             pProcessThread = (thread*)0;
  223.             return FALSE;
  224.         }
  225. }
  226.  
  227.  
  228. int main(int argc, char **argv)
  229. {    serverProcess *pProcess = new serverProcess(argc, argv);
  230.  
  231.     if (pProcess)
  232.         pProcess->run();
  233.     delete pProcess;
  234.     DosExit(EXIT_PROCESS, 0);
  235.     return 0;
  236. }
  237.  
  238.  
  239. dLLName::dLLName(char *pString, chain *pParent)
  240.     :stringChainElement(pString, pParent)
  241. {    char acBuffer[1024];
  242.     char *(*pFctGetName)(void);
  243.     APIRET iRet;
  244.  
  245.     if (iRet = DosLoadModule((unsigned char*)acBuffer, sizeof acBuffer,
  246.         (unsigned char*)pString, &hDLL))
  247.     {    hDLL = (HMODULE)0;
  248.         setNoSuccess();
  249.         fprintf(stderr, "Error returned from DosLoadModule() == %u\n",
  250.             iRet);
  251.         return;
  252.     }
  253. /*
  254. @getName$qv                    @1
  255. @calculateFractal$quiuiuipucddddd @2
  256. */
  257.     if (iRet = DosQueryProcAddr(hDLL, 0, (unsigned char*)"_getName",
  258.         (PFN*)&pFctGetName))
  259.     {    setNoSuccess();
  260.         fprintf(stderr, "Error returned from DosQueryProcAddr(%s) == %u\n",
  261.             "getName",
  262.             iRet);
  263.         return;
  264.     }
  265.     if (!(pDescription = (*pFctGetName)()))
  266.     {    setNoSuccess();
  267.         return;
  268.     }
  269.     if (iRet = DosQueryProcAddr(hDLL,
  270.         0,
  271.         (unsigned char*)"_calculateFractal",
  272.         (PFN*)&pFctCalculate))
  273.     {    setNoSuccess();
  274.         fprintf(stderr, "Error returned from DosQueryProcAddr(%s) == %u\n",
  275.             "calculateFractal",
  276.             iRet);
  277.         return;
  278.     }
  279. }
  280.  
  281.  
  282. dLLName::~dLLName(void)
  283. {    if (hDLL)
  284.         DosFreeModule(hDLL);
  285. }
  286.  
  287.  
  288. int dLLName::toBeCalledForeachElement(unsigned int iMsg, void *pDummy)
  289. {    switch (iMsg)
  290.     {    default:
  291.             return stringChainElement
  292.                 ::toBeCalledForeachElement(iMsg, pDummy);
  293.         case idForeachDLLNameGetThisByDescription:
  294.             if (!strcmp(*(char**)pDummy, pDescription))
  295.             {    *(dLLName**)pDummy = this;
  296.                 return -1;
  297.             }
  298.             else
  299.                 return 0;
  300.     }
  301. }