diff --git a/ext/fox16_c/FXRuby.cpp b/ext/fox16_c/FXRuby.cpp index 4d014fdaa39b3811768b90203246df51d65c63db..090e7caf2604a88eb73d100ec3d01a8b1dc59eb4 100644 --- a/ext/fox16_c/FXRuby.cpp +++ b/ext/fox16_c/FXRuby.cpp @@ -185,23 +185,38 @@ void* FXRbConvertPtr(VALUE obj,swig_type_info* ty){ FXbool FXRbCatchExceptions=FALSE; // Returns an FXInputHandle for this Ruby file object -FXInputHandle FXRbGetReadFileHandle(VALUE obj) { +FXInputHandle FXRbGetReadFileHandle(VALUE obj,FXuint mode) { int fd; fd = FIX2INT(rb_funcall(obj, rb_intern("fileno"), 0)); #ifdef WIN32 #ifdef __CYGWIN__ return (FXInputHandle) get_osfhandle(fd); #else - return (FXInputHandle) _get_osfhandle(fd); + WSAEVENT hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + long events = 0; + if(mode&INPUT_READ) events |= FD_READ|FD_ACCEPT|FD_OOB; + if(mode&INPUT_EXCEPT) events |= FD_CLOSE|FD_QOS|FD_GROUP_QOS|FD_ROUTING_INTERFACE_CHANGE|FD_ADDRESS_LIST_CHANGE; + if ( WSAEventSelect(_get_osfhandle(fd), hEvent, events) == SOCKET_ERROR ) { + WSACloseEvent( hEvent ); + rb_raise( rb_eRuntimeError, "WSAEventSelect sockett error: %d", WSAGetLastError() ); + } + rb_iv_set(obj, "FXRuby::FXRbGetReadFileHandle", ULL2NUM((intptr_t)hEvent)); + return (FXInputHandle) hEvent; #endif #else return (FXInputHandle) fd; #endif } +void FXRbRemoveReadFileHandle(VALUE obj,FXuint mode) { +#ifdef WIN32 + WSAEVENT hEvent = (HANDLE)NUM2ULL(rb_iv_get(obj, "FXRuby::FXRbGetReadFileHandle")); + CloseHandle( hEvent ); +#endif +} // Returns an FXInputHandle for this Ruby file object -FXInputHandle FXRbGetWriteFileHandle(VALUE obj) { +FXInputHandle FXRbGetWriteFileHandle(VALUE obj,FXuint mode) { int fd; #if defined(RUBINIUS) VALUE vwrite = rb_intern("@write"); @@ -223,13 +238,29 @@ FXInputHandle FXRbGetWriteFileHandle(VALUE obj) { #ifdef __CYGWIN__ return (FXInputHandle) get_osfhandle(fd); #else - return (FXInputHandle) _get_osfhandle(fd); + WSAEVENT hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + long events = 0; + if(mode&INPUT_WRITE) events |= FD_WRITE|FD_CONNECT; + if(mode&INPUT_EXCEPT) events |= FD_CLOSE|FD_QOS|FD_GROUP_QOS|FD_ROUTING_INTERFACE_CHANGE|FD_ADDRESS_LIST_CHANGE; + if ( WSAEventSelect(_get_osfhandle(fd), hEvent, events) == SOCKET_ERROR ) { + WSACloseEvent( hEvent ); + rb_raise( rb_eRuntimeError, "WSAEventSelect sockettt error: %d", WSAGetLastError() ); + } + rb_iv_set(obj, "FXRuby::FXRbGetWriteFileHandle", ULL2NUM((intptr_t)hEvent)); + return (FXInputHandle) hEvent; #endif #else return (FXInputHandle) fd; #endif } +void FXRbRemoveWriteFileHandle(VALUE obj,FXuint mode) { +#ifdef WIN32 + WSAEVENT hEvent = (HANDLE)NUM2ULL(rb_iv_get(obj, "FXRuby::FXRbGetWriteFileHandle")); + CloseHandle( hEvent ); +#endif +} + // Register this Ruby class instance void FXRbRegisterRubyObj(VALUE rubyObj,const void* foxObj) { diff --git a/ext/fox16_c/include/FXRuby.h b/ext/fox16_c/include/FXRuby.h index c601e36abca323ec513725b85a5838249ea96ded..b04f85881b656592554f1bcf7134254f092b7874 100644 --- a/ext/fox16_c/include/FXRuby.h +++ b/ext/fox16_c/include/FXRuby.h @@ -91,8 +91,10 @@ swig_type_info *FXRbTypeQuery(const char *name); void* FXRbConvertPtr(VALUE obj,swig_type_info* typeinfo); // Returns an FXInputHandle for this Ruby file object -FXInputHandle FXRbGetReadFileHandle(VALUE obj); -FXInputHandle FXRbGetWriteFileHandle(VALUE obj); +FXInputHandle FXRbGetReadFileHandle(VALUE obj,FXuint mode); +FXInputHandle FXRbGetWriteFileHandle(VALUE obj,FXuint mode); +void FXRbRemoveReadFileHandle(VALUE obj,FXuint mode); +void FXRbRemoveWriteFileHandle(VALUE obj,FXuint mode); // Register mapping from Ruby objects to FOX objects void FXRbRegisterRubyObj(VALUE rubyObj, const void* foxObj); diff --git a/swig-interfaces/FXApp.i b/swig-interfaces/FXApp.i index 9f20fca05b0b085bce8cb2bff6bba2351f368866..f25f8b4c7a56aa092c0c2651cbf87f2c2ef134f6 100644 --- a/swig-interfaces/FXApp.i +++ b/swig-interfaces/FXApp.i @@ -357,18 +357,13 @@ public: */ bool addInput(VALUE obj,FXuint mode,FXObject *tgt,FXSelector sel){ FXInputHandle fd; - FXuint m; - if(mode&INPUT_READ){ - m=INPUT_READ; - if(mode&INPUT_EXCEPT) m|=INPUT_EXCEPT; - fd=FXRbGetReadFileHandle(obj); - self->addInput(fd,m,tgt,sel); + if(mode&(INPUT_READ|INPUT_EXCEPT)){ + fd=FXRbGetReadFileHandle(obj, mode); + self->addInput(fd,mode,tgt,sel); } - if(mode&INPUT_WRITE){ - m=INPUT_WRITE; - if(mode&INPUT_EXCEPT) m|=INPUT_EXCEPT; - fd=FXRbGetWriteFileHandle(obj); - self->addInput(fd,m,tgt,sel); + if(mode&(INPUT_WRITE|INPUT_EXCEPT)){ + fd=FXRbGetWriteFileHandle(obj, mode); + self->addInput(fd,mode,tgt,sel); } return true; } @@ -379,18 +374,15 @@ public: */ bool removeInput(VALUE obj,FXuint mode){ FXInputHandle fd; - FXuint m; - if(mode&INPUT_READ){ - m=INPUT_READ; - if(mode&INPUT_EXCEPT) m|=INPUT_EXCEPT; - fd=FXRbGetReadFileHandle(obj); - self->removeInput(fd,m); + if(mode&INPUT_READ|INPUT_EXCEPT){ + fd=FXRbGetReadFileHandle(obj, mode); + self->removeInput(fd,mode); + FXRbRemoveReadFileHandle(obj, mode); } - if(mode&INPUT_WRITE){ - m=INPUT_WRITE; - if(mode&INPUT_EXCEPT) m|=INPUT_EXCEPT; - fd=FXRbGetWriteFileHandle(obj); - self->removeInput(fd,m); + if(mode&(INPUT_WRITE|INPUT_EXCEPT)){ + fd=FXRbGetWriteFileHandle(obj, mode); + self->removeInput(fd,mode); + FXRbRemoveWriteFileHandle(obj, mode); } return true; }