1/* ------------------------------------------------------------------------- 2 * Project: GSocket (Generic Socket) for WX 3 * Name: src/gtk1/gsockgtk.cpp 4 * Purpose: GSocket: GTK part 5 * Licence: The wxWindows licence 6 * CVSID: $Id: gsockgtk.cpp 37159 2006-01-26 16:02:02Z ABX $ 7 * ------------------------------------------------------------------------- 8 */ 9// For compilers that support precompilation, includes "wx.h". 10#include "wx/wxprec.h" 11 12#if wxUSE_SOCKETS 13 14#include <assert.h> 15#include <stdlib.h> 16#include <stdio.h> 17 18#include <gdk/gdk.h> 19#include <glib.h> 20 21#include "wx/gsocket.h" 22#include "wx/unix/gsockunx.h" 23 24 25extern "C" { 26static 27void _GSocket_GDK_Input(gpointer data, 28 gint source, 29 GdkInputCondition condition) 30{ 31 GSocket *socket = (GSocket *)data; 32 33 if (condition & GDK_INPUT_READ) 34 socket->Detected_Read(); 35 if (condition & GDK_INPUT_WRITE) 36 socket->Detected_Write(); 37} 38} 39 40bool GSocketGUIFunctionsTableConcrete::CanUseEventLoop() 41{ return true; } 42 43bool GSocketGUIFunctionsTableConcrete::OnInit(void) 44{ 45 return 1; 46} 47 48void GSocketGUIFunctionsTableConcrete::OnExit(void) 49{ 50} 51 52bool GSocketGUIFunctionsTableConcrete::Init_Socket(GSocket *socket) 53{ 54 gint *m_id; 55 56 socket->m_gui_dependent = (char *)malloc(sizeof(gint)*2); 57 m_id = (gint *)(socket->m_gui_dependent); 58 59 m_id[0] = -1; 60 m_id[1] = -1; 61 62 return TRUE; 63} 64 65void GSocketGUIFunctionsTableConcrete::Destroy_Socket(GSocket *socket) 66{ 67 free(socket->m_gui_dependent); 68} 69 70void GSocketGUIFunctionsTableConcrete::Install_Callback(GSocket *socket, GSocketEvent event) 71{ 72 gint *m_id = (gint *)(socket->m_gui_dependent); 73 int c; 74 75 if (socket->m_fd == -1) 76 return; 77 78 switch (event) 79 { 80 case GSOCK_LOST: /* fall-through */ 81 case GSOCK_INPUT: c = 0; break; 82 case GSOCK_OUTPUT: c = 1; break; 83 case GSOCK_CONNECTION: c = ((socket->m_server) ? 0 : 1); break; 84 default: return; 85 } 86 87 if (m_id[c] != -1) 88 gdk_input_remove(m_id[c]); 89 90 m_id[c] = gdk_input_add(socket->m_fd, 91 (c ? GDK_INPUT_WRITE : GDK_INPUT_READ), 92 _GSocket_GDK_Input, 93 (gpointer)socket); 94} 95 96void GSocketGUIFunctionsTableConcrete::Uninstall_Callback(GSocket *socket, GSocketEvent event) 97{ 98 gint *m_id = (gint *)(socket->m_gui_dependent); 99 int c; 100 101 assert( m_id != NULL ); 102 103 switch (event) 104 { 105 case GSOCK_LOST: /* fall-through */ 106 case GSOCK_INPUT: c = 0; break; 107 case GSOCK_OUTPUT: c = 1; break; 108 case GSOCK_CONNECTION: c = ((socket->m_server) ? 0 : 1); break; 109 default: return; 110 } 111 112 if (m_id[c] != -1) 113 { 114 gdk_input_remove(m_id[c]); 115 m_id[c] = -1; 116 } 117} 118 119void GSocketGUIFunctionsTableConcrete::Enable_Events(GSocket *socket) 120{ 121 Install_Callback(socket, GSOCK_INPUT); 122 Install_Callback(socket, GSOCK_OUTPUT); 123} 124 125void GSocketGUIFunctionsTableConcrete::Disable_Events(GSocket *socket) 126{ 127 Uninstall_Callback(socket, GSOCK_INPUT); 128 Uninstall_Callback(socket, GSOCK_OUTPUT); 129} 130 131#else /* !wxUSE_SOCKETS */ 132 133/* some compilers don't like having empty source files */ 134static int wxDummyGsockVar = 0; 135 136#endif /* wxUSE_SOCKETS/!wxUSE_SOCKETS */ 137