⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tgi.c

📁 《Web编程专家指南》
💻 C
字号:
/*
 *  Task  Gateway  Interface
 *  A. Montefusco
 *  June 10, 1995
 *
 *
 */

#define  INCL_DOSSEMAPHORES
#define  INCL_DOSERRORS
#define  INCL_DOSPROCESS
#define  INCL_DOSMEMMGR
#include <os2.h>
#include <string.h>
#include <stdio.h>
#include "debug.h"
#include "tgi.h"
#include "tgiglob.h"


/*
 *  Non-shared DLL variables
 *  For each task there is an istance of this data segment
 */

HMTX   hLocMutex = NULLHANDLE;

HTGI   LocTab [MAX_MOD];



long  _RegisterInstance (HTGI  hTgi, PROC_INSTANCE  *pInstData)
{
   long   rc = TGI_OK;
   TGI_MODULE  *pMod = (TGI_MODULE *) hTgi;

   if ((pMod == NULL) || (pInstData == NULL))
      return TGI_BAD_PARAM;
   else {
      PROC_INSTANCE *p;

      _LockData ();

      pInstData->pNext = pMod->pNextInstance;
      pMod->pNextInstance = pInstData;

      if (DosCreateEventSem (0, &(pInstData->hInstAva), DC_SEM_SHARED, TRUE))
         rc = TGI_SEM_CREATE;

      _UnLockData ();
      return rc;
   }
}

long  _UnRegisterInstance (HTGI  hTgi, PROC_INSTANCE  *pInstData)
{
   long   rc = TGI_OK;
   TGI_MODULE  *pMod = (TGI_MODULE *) hTgi;

   if ((pMod == NULL) || (pInstData == NULL))
      return TGI_BAD_PARAM;
   else {
      PROC_INSTANCE *p;

      _LockData ();

      if (pMod->pNextInstance == NULL) {
         rc = TGI_BAD_INSTANCE;
      } else {
         PROC_INSTANCE *pCur  = pMod->pNextInstance;

         if (pCur == pInstData) {
            pMod->pNextInstance = pMod->pNextInstance->pNext;
         } else {

            for (; (pCur != NULL) && (pCur->pNext != pInstData); pCur = pCur->pNext) ;

            if (pCur == NULL)
               rc = TGI_BAD_INSTANCE;
            else {
               pCur->pNext = pInstData->pNext;
               DosCloseEventSem (pInstData->hInstAva);
            }

         } /* endif */
      } /* endif */

      _UnLockData ();
      return rc;
   }
}


long  _DoAction (HTGI  hTgi, PROC_INSTANCE  *pInstData)
{
   long         rc = TGI_OK;
   TGI_MODULE  *pMod = (TGI_MODULE *) hTgi;

   if ((pMod == NULL) || (pInstData == NULL))
      return TGI_BAD_PARAM;
   else {
      int   mrc;
      HEV   hSrv = pInstData->hInstEnded;

      rc = (pMod->pFn) ((HREQUEST)(pInstData->pTgiData), pInstData->pCbData);

      mrc = MbxSendMsg (pInstData->pTgiData->hMbx, 0, 0);
      TRACE(fprintf (stderr, "MbxSendMsg: %d\n", mrc););
      mrc = MbxClose (pInstData->pTgiData->hMbx);
      TRACE(fprintf (stderr, "MbxClose: %d\n", mrc););

      // unlock server task
      if (!DosOpenEventSem (NULL, &hSrv)) {

         DosPostEventSem (hSrv);
         DosCloseEventSem (hSrv);
      }

      return rc;
   }
}


long  _LockOnRequest (HTGI  hTgi, PROC_INSTANCE  *pInstData)
{
   ULONG  ulPostCount;
   APIRET src;
   long   rc;

   /*
    *  set semaphore to red to wait for a request
    */
   DosResetEventSem (pInstData->hInstAva, &ulPostCount);

   src = DosWaitEventSem (pInstData->hInstAva, SEM_INDEFINITE_WAIT);

   switch (src) {
   case NO_ERROR:
      rc = TGI_UNLOCK_OK;
      break;
   case ERROR_INTERRUPT:
      rc = TGI_EXIT;
      break;
   default:
      rc = TGI_UNLOCK_ERROR;
     break;
   } /* endswitch */

   if ((rc == TGI_UNLOCK_OK) && (_TgiRunning () != TGI_OK))
      rc = TGI_NOT_RUN;

   /*
    *  make the tgi data shared memory object visible in current context
    */
   if (rc == TGI_UNLOCK_OK) {

      APIRET  krc = DosGetSharedMem (pInstData->pTgiData, PAG_READ | PAG_WRITE);

      TRACE(fprintf (stderr, "DosGetSharedMem: %d\n", krc););

      if (krc) {
         rc = TGI_NO_MEM;
      } else {
         /* 
          *  open the callback mailbox
          */
         int  mrc = MbxOpen (pInstData->szMbxName, NULL, 
                             &(pInstData->pTgiData->hMbx));

         TRACE(fprintf (stderr, "MbxOpen: %d on [%s]\n", mrc, pInstData->szMbxName););

         if (mrc != MLBX_OK) rc = TGI_MLBX_OPEN;
      }
   }

   return rc;
}


static VOID APIENTRY DeregAllModInThisTask (void)
{
   int   i;

   TRACE(fprintf (stderr, "DeregAllModInThisTask\n"));

   for (i=0; i < sizeof(LocTab)/sizeof(LocTab[0]); ++i)
      if (LocTab[i] != 0)
         TgiDeregisterModule ( LocTab[i] );
}



/*
 *  TGI API functions
 *
 */

long   TgiRegisterModule ( char       *name,
                           PFNACTION   pFn,
                           HTGI       *pHTgi,
                           long        timeout
                         )
{
   long        rc, left;
   TGI_MODULE  *pMod;

   for (rc = TGI_NOT_RUN, left = timeout;
        (rc == TGI_NOT_RUN);
        left -= timeout / 10 + 1) {

      rc = _LockData ();
      if (rc == TGI_OK) break;

      if ( ((rc != TGI_OK) && (rc != TGI_NOT_RUN)) || (left <= 0L) ) return rc;

      DosSleep (timeout / 10);

   } 


   /*
    *  search a free slot in shared module table
    */
   if ((pMod = _GetFreeMod ()) != NULL) {

      if (_SearchModule (name, 0) == TGI_MOD_NOT_FOUND) {
         int   i;

         strncpy (pMod->szName, name, MAX_MOD_NAME-1);
         pMod->szName [MAX_MOD_NAME-1] = '\0';

         pMod->pNextInstance = NULL;
         pMod->pFn           = pFn;

         *pHTgi = (HTGI) pMod;

         // insert the module handle also in local table
         for (i=0; i < sizeof(LocTab)/sizeof(LocTab[0]); ++i)
            if (LocTab[i] == 0) {
               LocTab [i] = *pHTgi;
               break;
            }

         // to deregister the module anyway 
         if (i == 0) DosExitList (EXLST_ADD, (PFNEXITLIST)DeregAllModInThisTask);

      } else
         rc = TGI_MOD_ALREADY_REG;

   } else {
      rc = TGI_TOO_MANY_MOD;
   }

   _UnLockData ();
   return rc;
}


long   TgiProcessModule ( HTGI    hTgi,
                          void   *pCbData    )
{
   long   rc = TGI_OK;
   PROC_INSTANCE  * pProcInst;

   if ((rc = _LockData ()) != TGI_OK) return rc;

   pProcInst = _GetFreeInst ();
   pProcInst->pCbData = pCbData;

   rc = _RegisterInstance (hTgi, pProcInst);

   _UnLockData ();

   while (rc == TGI_OK) {
      int  rcLock;


      rcLock = _LockOnRequest (hTgi, pProcInst);

      if (rcLock == TGI_UNLOCK_OK) {
         _DoAction (hTgi, pProcInst);
      } else {
         rc = rcLock;
      }

   }

   if ((rc = _LockData ()) != TGI_OK) return rc;

   _UnRegisterInstance (hTgi, pProcInst);

   _DeleteInst (pProcInst);

   _UnLockData ();
   return rc;
}


long   TgiDeregisterModule ( HTGI    hTgi )
{
   long   rc = TGI_OK;
   TGI_MODULE  *pMod = (TGI_MODULE *) hTgi;

   if (pMod == NULL) return TGI_BAD_PARAM;


   if ((rc = _LockData ()) != TGI_OK) return rc;

   rc = _DeleteMod (pMod);

   _UnLockData ();
   return rc;
}



long   TgiGetPathInfo  ( HREQUEST hReq, char **pszPi )
{
   long      rc  = TGI_OK;
   TGI_DATA *pTd = (TGI_DATA *)hReq;

   *pszPi = pTd->pszPathInfo;

   return rc;
}


long   TgiGetQueryInfo ( HREQUEST hReq, char **pszQi )
{
   long   rc = TGI_OK;
   TGI_DATA *pTd = (TGI_DATA *)hReq;

   *pszQi = pTd->pszQueryInfo;

   return rc;
}


long   TgiGetFormData  ( HREQUEST hReq, char **pszFd )
{
   long   rc = TGI_OK;
   TGI_DATA *pTd = (TGI_DATA *)hReq;

   *pszFd = pTd->pszFormData;

   return rc;
}


long   TgiSetRedirFile ( HREQUEST hReq, char *pszRf  )
{
   long   rc = TGI_OK;
   TGI_DATA *pTd = (TGI_DATA *)hReq;

   return rc;
}


long   TgiPutHtml ( HREQUEST hReq, char *buf, long len )
{
   long   rc     = TGI_OK;
   TGI_DATA *pTd = (TGI_DATA *)hReq;

   if (MbxSendMsg (pTd->hMbx, buf, len) != MLBX_OK) rc = TGI_MLBX_SEND;

   return rc;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -