Ignore:
Timestamp:
Jul 7, 2001, 12:44:11 PM (24 years ago)
Author:
achimha
Message:

implemented WSAEventSelect

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wsock32/asyncapi.cpp

    r5625 r6196  
    1 /* $Id: asyncapi.cpp,v 1.9 2001-04-28 16:15:18 sandervl Exp $ */
     1/* $Id: asyncapi.cpp,v 1.10 2001-07-07 10:44:08 achimha Exp $ */
    22
    33/*
     
    156156
    157157   if(!pThreadParm->fCancelled) {
    158         dprintf(("WSAsyncThreadProc %x %x %x %x", pThreadParm->hwnd, pThreadParm->msg, pThreadParm->hAsyncTaskHandle, lParam));
    159         PostMessageA(pThreadParm->hwnd, pThreadParm->msg,
     158        dprintf(("WSAsyncThreadProc %x %x %x %x", pThreadParm->notifyHandle, pThreadParm->notifyData, pThreadParm->hAsyncTaskHandle, lParam));
     159        PostMessageA((HWND)pThreadParm->notifyHandle, (DWORD)pThreadParm->notifyData,
    160160                     (WPARAM)pThreadParm->hAsyncTaskHandle, lParam);
    161161   }
     
    203203        }
    204204        memset(pThreadParm, 0, sizeof(*pThreadParm));
    205         pThreadParm->request= requesttype;
    206         pThreadParm->hwnd   = hwnd;
    207         pThreadParm->msg    = msg;
    208         pThreadParm->buf    = buf;
    209         pThreadParm->buflen = buflen;
     205        pThreadParm->request      = requesttype;
     206        pThreadParm->notifyHandle = (int)hwnd;
     207        pThreadParm->notifyData   = (int)msg;
     208        pThreadParm->buf          = buf;
     209        pThreadParm->buflen       = buflen;
    210210
    211211        switch(requesttype) {
     
    399399//******************************************************************************
    400400//******************************************************************************
    401 void AsyncNotifyEvent(PASYNCTHREADPARM pThreadParm, ULONG event, ULONG socket_error)
    402 {
    403    pThreadParm->u.asyncselect.lEventsPending &= ~event;
    404 
    405    event = WSAMAKESELECTREPLY(event, socket_error);
    406 
    407    dprintf(("AsyncNotifyEvent %x %x %x %x", pThreadParm->u.asyncselect.s, pThreadParm->hwnd, pThreadParm->msg, event));
    408    PostMessageA(pThreadParm->hwnd, pThreadParm->msg, (WPARAM)pThreadParm->u.asyncselect.s,
    409                (LPARAM)event);
     401void AsyncSelectNotifyEvent(PASYNCTHREADPARM pThreadParm, ULONG event, ULONG socket_error)
     402{
     403    pThreadParm->u.asyncselect.lEventsPending &= ~event;
     404
     405    event = WSAMAKESELECTREPLY(event, socket_error);
     406
     407    if (pThreadParm->u.asyncselect.mode == WSA_SELECT_HWND)
     408    {
     409        dprintf(("AsyncSelectNotifyEvent: notifying window %x %x %x %x", pThreadParm->u.asyncselect.s, pThreadParm->notifyHandle, pThreadParm->notifyData, event));
     410        PostMessageA((HWND)pThreadParm->notifyHandle, (DWORD)pThreadParm->notifyData, (WPARAM)pThreadParm->u.asyncselect.s,
     411                     (LPARAM)event);
     412    }
     413    else
     414    if (pThreadParm->u.asyncselect.mode == WSA_SELECT_HEVENT)
     415    {
     416        dprintf(("AsyncSelectNotifyEvent: notifying event semaphore %x %x %x %x", pThreadParm->u.asyncselect.s, pThreadParm->notifyHandle, pThreadParm->notifyData, event));
     417        SetEvent(pThreadParm->notifyHandle);
     418    }
     419    else
     420    {
     421        dprintf(("AsyncSelectNotifyEvent: error, unknown mode"));
     422    }
    410423}
    411424//******************************************************************************
     
    483496                        if(lEventsPending & FD_CLOSE) {
    484497                                dprintf(("FD_CLOSE; broken connection"));
    485                                 AsyncNotifyEvent(pThreadParm, FD_CLOSE, WSAECONNRESET);
     498                                AsyncSelectNotifyEvent(pThreadParm, FD_CLOSE, WSAECONNRESET);
    486499                        }
    487500
     
    494507                        if(lEventsPending & FD_CLOSE) {
    495508                                dprintf(("FD_CLOSE; SOCEINVAL"));
    496                                 AsyncNotifyEvent(pThreadParm, FD_CLOSE, selecterr);
     509                                AsyncSelectNotifyEvent(pThreadParm, FD_CLOSE, selecterr);
    497510                        }
    498511                        break;
     
    510523                if(lEventsPending & FD_CONNECT) {
    511524                        if(state & SS_ISCONNECTED) {
    512                                 AsyncNotifyEvent(pThreadParm, FD_CONNECT, NO_ERROR);
     525                                AsyncSelectNotifyEvent(pThreadParm, FD_CONNECT, NO_ERROR);
    513526                        }
    514527                        else {
     
    519532                                //SvL: WSeB returns SOCECONNREFUSED, Warp 4 0x3d
    520533                                if(sockoptval == SOCECONNREFUSED || sockoptval == (SOCECONNREFUSED - SOCBASEERR)) {
    521                                         AsyncNotifyEvent(pThreadParm, FD_CONNECT, WSAECONNREFUSED);
     534                                        AsyncSelectNotifyEvent(pThreadParm, FD_CONNECT, WSAECONNREFUSED);
    522535                                }
    523536                        }
     
    525538                else
    526539                if(!(state & SS_CANTSENDMORE) && (lEventsPending & FD_WRITE)) {
    527                         AsyncNotifyEvent(pThreadParm, FD_WRITE, NO_ERROR);
     540                        AsyncSelectNotifyEvent(pThreadParm, FD_WRITE, NO_ERROR);
    528541                }
    529542        }
     
    537550                        {
    538551                                dprintf(("FD_CLOSE; ioctl; socket error"));
    539                                 AsyncNotifyEvent(pThreadParm, FD_CLOSE, NO_ERROR);
     552                                AsyncSelectNotifyEvent(pThreadParm, FD_CLOSE, NO_ERROR);
    540553                                //remote connection broken (so can't receive data anymore)
    541554                                //but can still send
     
    559572                        }
    560573                        if((sockoptval & SO_ACCEPTCONN) == SO_ACCEPTCONN) {
    561                                 AsyncNotifyEvent(pThreadParm, FD_ACCEPT, NO_ERROR);
     574                                AsyncSelectNotifyEvent(pThreadParm, FD_ACCEPT, NO_ERROR);
    562575                        }
    563576                }
    564577                if((lEventsPending & FD_READ) && bytesread >= 0) {
    565                         AsyncNotifyEvent(pThreadParm, FD_READ, NO_ERROR);
     578                        AsyncSelectNotifyEvent(pThreadParm, FD_READ, NO_ERROR);
    566579                }
    567580#if 0
     
    571584                if((lEventsPending & FD_CLOSE) && (state == 0 && bytesread == 0)) {
    572585                        dprintf(("FD_CLOSE; state == 0 && bytesread == 0"));
    573                         AsyncNotifyEvent(pThreadParm, FD_CLOSE, NO_ERROR);
     586                        AsyncSelectNotifyEvent(pThreadParm, FD_CLOSE, NO_ERROR);
    574587                }
    575588#endif
     
    578591        {
    579592                if(lEventsPending & FD_OOB) {
    580                         AsyncNotifyEvent(pThreadParm, FD_OOB, NO_ERROR);
     593                        AsyncSelectNotifyEvent(pThreadParm, FD_OOB, NO_ERROR);
    581594                }
    582595        }
     
    600613              long,lEvent)
    601614{
     615   /* just forward call to worker method */
     616   return WSAAsyncSelectWorker(s, WSA_SELECT_HWND, (int)hWnd, (int)wMsg, lEvent);
     617}
     618//******************************************************************************
     619//******************************************************************************
     620int WSAAsyncSelectWorker(SOCKET s, int mode, int notifyHandle, int notifyData, long lEventMask)
     621{
    602622  PASYNCTHREADPARM pThreadParm;
    603623  int              nonblock = 1;
    604624  int              ret;
    605625
     626#ifdef DEBUG
     627    // log all event bits that are set
     628    char tmpbuf[300];
     629    strcpy(tmpbuf, "");
     630    if (lEventMask & FD_READ)
     631        strcat(tmpbuf, " FD_READ");
     632    if (lEventMask & FD_WRITE)
     633        strcat(tmpbuf, " FD_WRITE");
     634    if (lEventMask & FD_OOB)
     635        strcat(tmpbuf, " FD_OOB");   
     636    if (lEventMask & FD_ACCEPT)
     637        strcat(tmpbuf, " FD_ACCEPT");
     638    if (lEventMask & FD_CONNECT)
     639        strcat(tmpbuf, " FD_CONNECT");
     640    if (lEventMask & FD_CLOSE)
     641        strcat(tmpbuf, " FD_CLOSE");
     642    if (lEventMask & FD_QOS)
     643        strcat(tmpbuf, " FD_QOS");
     644    if (lEventMask & FD_GROUP_QOS)
     645        strcat(tmpbuf, " FD_GROUP_QOS");
     646    if (lEventMask & FD_ROUTING_INTERFACE_CHANGE)
     647        strcat(tmpbuf, " FD_ROUTING_INTERFACE_CHANGE");
     648    if (lEventMask & FD_ADDRESS_LIST_CHANGE)
     649        strcat(tmpbuf, " FD_ADDRESS_LIST_CHANGE");
     650    dprintf(("event bits:%s", tmpbuf));
     651#endif
     652
    606653   if(!fWSAInitialized)
    607654   {
     655        dprintf(("WSA sockets not initialized"));
    608656        WSASetLastError(WSANOTINITIALISED);
    609657        return SOCKET_ERROR;
     
    612660   if(WSAIsBlocking())
    613661   {
     662        dprintf(("blocking call in progress"));
    614663        WSASetLastError(WSAEINPROGRESS);        // blocking call in progress
    615664        return SOCKET_ERROR;
    616665   }
    617666   else
    618    if(hWnd && !IsWindow(hWnd))
    619    {
     667   if((mode == WSA_SELECT_HWND) && (HWND)notifyHandle && !IsWindow((HWND)notifyHandle))
     668   {
     669        dprintf(("invalid window handle"));
    620670        WSASetLastError(WSAEINVAL);             // invalid parameter
    621671        return SOCKET_ERROR;
    622672   }
     673#if 0
     674// AH: null sempahore is ok when clearing request
     675   else
     676   if ((mode == WSA_SELECT_HEVENT) && !(WSAEVENT)notifyHandle)
     677   {
     678        dprintf(("invalid event semaphore handle"));
     679        WSASetLastError(WSAEINVAL);             // invalid parameter
     680        return SOCKET_ERROR;
     681   }
     682#endif
     683
    623684   //Set socket to non-blocking mode
    624685   ret = ioctl(s, FIONBIO, (char *) &nonblock, sizeof(nonblock));
    625686   if(ret == SOCKET_ERROR) {
     687        dprintf(("setting socket to non blocking mode failed"));
    626688        WSASetLastError(wsaErrno());
    627689        return SOCKET_ERROR;
    628690   }
    629    if(FindAndSetAsyncEvent(s, hWnd, wMsg, lEvent) == TRUE) {
     691   if(FindAndSetAsyncEvent(s, mode, notifyHandle, notifyData, lEventMask) == TRUE)
     692   {
     693        dprintf(("already got socket, just changing event mask"));
    630694        //found and changed active async event
    631695        WSASetLastError(NO_ERROR);
     
    640704   }
    641705   memset(pThreadParm, 0, sizeof(*pThreadParm));
    642    pThreadParm->request= ASYNC_SELECT;
    643    pThreadParm->hwnd   = hWnd;
    644    pThreadParm->msg    = wMsg;
    645    pThreadParm->u.asyncselect.lEvents        = lEvent;
    646    pThreadParm->u.asyncselect.lEventsPending = lEvent;
     706   pThreadParm->request                      = ASYNC_SELECT;
     707   pThreadParm->notifyHandle                 = notifyHandle;
     708   pThreadParm->notifyData                   = notifyData;
     709   pThreadParm->u.asyncselect.mode           = mode;
     710   pThreadParm->u.asyncselect.lEvents        = lEventMask;
     711   pThreadParm->u.asyncselect.lEventsPending = lEventMask;
    647712   pThreadParm->u.asyncselect.s              = s;
    648713   pThreadParm->u.asyncselect.asyncSem       = new VSemaphore;
Note: See TracChangeset for help on using the changeset viewer.