-#if wxUSE_SOCKETS
-// ----------------------------------------------------------------------------
-// wxSocketTable
-// ----------------------------------------------------------------------------
-
-typedef void (*wxSocketCallback) (int fd, void* data);
-
-class wxSocketTableEntry: public wxObject
-{
- public:
- wxSocketTableEntry()
- {
- m_fdInput = -1; m_fdOutput = -1;
- m_callbackInput = NULL; m_callbackOutput = NULL;
- m_dataInput = NULL; m_dataOutput = NULL;
- }
-
- int m_fdInput;
- int m_fdOutput;
- wxSocketCallback m_callbackInput;
- wxSocketCallback m_callbackOutput;
- void* m_dataInput;
- void* m_dataOutput;
-};
-
-typedef enum
-{ wxSocketTableInput, wxSocketTableOutput } wxSocketTableType ;
-
-class wxSocketTable: public wxHashTable
-{
- public:
- wxSocketTable(): wxHashTable(wxKEY_INTEGER)
- {
- }
- ~wxSocketTable()
- {
- WX_CLEAR_HASH_TABLE(*this)
- }
-
- wxSocketTableEntry* FindEntry(int fd);
-
- void RegisterCallback(int fd, wxSocketTableType socketType, wxSocketCallback callback, void* data);
-
- void UnregisterCallback(int fd, wxSocketTableType socketType);
-
- bool CallCallback(int fd, wxSocketTableType socketType);
-
- void FillSets(fd_set* readset, fd_set* writeset, int* highest);
-
- void ProcessEvents(fd_set* readset, fd_set* writeset);
-};
-
-wxSocketTableEntry* wxSocketTable::FindEntry(int fd)
-{
- wxSocketTableEntry* entry = (wxSocketTableEntry*) Get(fd);
- return entry;
-}
-
-void wxSocketTable::RegisterCallback(int fd, wxSocketTableType socketType, wxSocketCallback callback, void* data)
-{
- wxSocketTableEntry* entry = FindEntry(fd);
- if (!entry)
- {
- entry = new wxSocketTableEntry();
- Put(fd, entry);
- }
-
- if (socketType == wxSocketTableInput)
- {
- entry->m_fdInput = fd;
- entry->m_dataInput = data;
- entry->m_callbackInput = callback;
- }
- else
- {
- entry->m_fdOutput = fd;
- entry->m_dataOutput = data;
- entry->m_callbackOutput = callback;
- }
-}
-
-void wxSocketTable::UnregisterCallback(int fd, wxSocketTableType socketType)
-{
- wxSocketTableEntry* entry = FindEntry(fd);
- if (entry)
- {
- if (socketType == wxSocketTableInput)
- {
- entry->m_fdInput = -1;
- entry->m_dataInput = NULL;
- entry->m_callbackInput = NULL;
- }
- else
- {
- entry->m_fdOutput = -1;
- entry->m_dataOutput = NULL;
- entry->m_callbackOutput = NULL;
- }
- if (entry->m_fdInput == -1 && entry->m_fdOutput == -1)
- {
- Delete(fd);
- delete entry;
- }
- }
-}
-
-bool wxSocketTable::CallCallback(int fd, wxSocketTableType socketType)
-{
- wxSocketTableEntry* entry = FindEntry(fd);
- if (entry)
- {
- if (socketType == wxSocketTableInput)
- {
- if (entry->m_fdInput != -1 && entry->m_callbackInput)
- {
- (entry->m_callbackInput) (entry->m_fdInput, entry->m_dataInput);
- }
- }
- else
- {
- if (entry->m_fdOutput != -1 && entry->m_callbackOutput)
- {
- (entry->m_callbackOutput) (entry->m_fdOutput, entry->m_dataOutput);
- }
- }
- return true;
- }
- else
- return false;
-}
-
-void wxSocketTable::FillSets(fd_set* readset, fd_set* writeset, int* highest)
-{
- BeginFind();
- wxHashTable::compatibility_iterator node = Next();
- while (node)
- {
- wxSocketTableEntry* entry = (wxSocketTableEntry*) node->GetData();
-
- if (entry->m_fdInput != -1)
- {
- wxFD_SET(entry->m_fdInput, readset);
- if (entry->m_fdInput > *highest)
- * highest = entry->m_fdInput;
- }
-
- if (entry->m_fdOutput != -1)
- {
- wxFD_SET(entry->m_fdOutput, writeset);
- if (entry->m_fdOutput > *highest)
- * highest = entry->m_fdOutput;
- }
-
- node = Next();
- }
-}
-
-void wxSocketTable::ProcessEvents(fd_set* readset, fd_set* writeset)
-{
- BeginFind();
- wxHashTable::compatibility_iterator node = Next();
- while (node)
- {
- wxSocketTableEntry* entry = (wxSocketTableEntry*) node->GetData();
-
- if (entry->m_fdInput != -1 && wxFD_ISSET(entry->m_fdInput, readset))
- {
- (entry->m_callbackInput) (entry->m_fdInput, entry->m_dataInput);
- }
-
- if (entry->m_fdOutput != -1 && wxFD_ISSET(entry->m_fdOutput, writeset))
- {
- (entry->m_callbackOutput) (entry->m_fdOutput, entry->m_dataOutput);
- }
-
- node = Next();
- }
-}
-
-wxSocketTable* wxTheSocketTable = NULL;
-
-class wxSocketTableModule: public wxModule
-{
-DECLARE_DYNAMIC_CLASS(wxSocketTableModule)
-public:
- wxSocketTableModule() {}
- bool OnInit() { wxTheSocketTable = new wxSocketTable; return true; };
- void OnExit() { delete wxTheSocketTable; wxTheSocketTable = NULL; };
-};
-
-IMPLEMENT_DYNAMIC_CLASS(wxSocketTableModule, wxModule)
-
-// Implement registration functions as C functions so they
-// can be called from gsock11.c
-
-extern "C" void wxRegisterSocketCallback(int fd, wxSocketTableType socketType, wxSocketCallback callback, void* data)
-{
- if (wxTheSocketTable)
- {
- wxTheSocketTable->RegisterCallback(fd, socketType, callback, data);
- }
-}
-
-extern "C" void wxUnregisterSocketCallback(int fd, wxSocketTableType socketType)
-{
- if (wxTheSocketTable)
- {
- wxTheSocketTable->UnregisterCallback(fd, socketType);
- }
-}