?? tgi.c
字號(hào):
/*
* 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;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -