]> git.saurik.com Git - wxWidgets.git/commitdiff
Added net stuff, some fixes to gsock code for WinCE
authorJulian Smart <julian@anthemion.co.uk>
Sat, 12 Jul 2003 17:58:22 +0000 (17:58 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Sat, 12 Jul 2003 17:58:22 +0000 (17:58 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@21923 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gsocket.h
include/wx/msw/wince/net.h [new file with mode: 0644]
src/msw/gsocket.c
src/msw/gsockmsw.c
src/msw/utils.cpp
src/msw/wince/net.cpp [new file with mode: 0644]

index 54db19bc4eae2a0826c71eb2a1f6b21abec583e8..5cd91ae0018a6c7961345468155f0120f361a95c 100644 (file)
    having been defined in sys/types.h" when winsock.h is included later and
    doesn't seem to be necessary anyhow. It's not needed under Mac neither.
  */
    having been defined in sys/types.h" when winsock.h is included later and
    doesn't seem to be necessary anyhow. It's not needed under Mac neither.
  */
-#if !defined(__WXMAC__) && !defined(__CYGWIN__)
+#if !defined(__WXMAC__) && !defined(__CYGWIN__) && !defined(__WXWINCE__)
 #include <sys/types.h>
 #endif
 
 #include <sys/types.h>
 #endif
 
+#ifdef __WXWINCE__
+#include <stdlib.h>
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/include/wx/msw/wince/net.h b/include/wx/msw/wince/net.h
new file mode 100644 (file)
index 0000000..7476d80
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright 1998, Ben Goetter.  All rights reserved.
+
+/*
+ patch holes in winsock 
+
+  WCE 2.0 lacks many of the 'database' winsock routines.
+  Stub just enough them for ss.dll.
+
+  getprotobynumber
+  getservbyport
+  getservbyname
+
+*/
+
+struct servent * WINSOCKAPI getservbyport(int port, const char * proto) ;
+
+struct servent * WINSOCKAPI getservbyname(const char * name,
+                                          const char * proto) ;
+struct protoent * WINSOCKAPI getprotobynumber(int proto) ;
+
index 9ea70c328efa5d35d33b16bcdea87ecbeb158318..0a5ad3a4acad0c21ec6e6be35f7e8fb851749dc7 100644 (file)
 #  define _GSocket_Disable_Events(socket)
 #endif /* wxUSE_GUI */
 
 #  define _GSocket_Disable_Events(socket)
 #endif /* wxUSE_GUI */
 
+#ifndef __WXWINCE__
 #include <assert.h>
 #include <assert.h>
+#else
+#define assert(x)
+#ifndef isdigit
+#define isdigit(x) (x > 47 && x < 58)
+#endif
+#include "wx/msw/wince/net.h"
+#endif
+
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
index 32131c214a0c58f32feffafb2273eca237a9b1ef..5016995a452473806e39bafc0a1fd2ad6f6217f6 100644 (file)
@@ -7,6 +7,14 @@
  * -------------------------------------------------------------------------
  */
 
  * -------------------------------------------------------------------------
  */
 
+/*
+ * TODO: for WinCE we need to replace WSAAsyncSelect
+ * (Windows message-based notification of network events for a socket)
+ * with another mechanism.
+ * We may need to have a separate thread that polls for socket events
+ * using select() and sends a message to the main thread.
+ */
+
 /*
  * PLEASE don't put C++ comments here - this is a C source file.
  */
 /*
  * PLEASE don't put C++ comments here - this is a C source file.
  */
 #  pragma warning(disable:4115) /* named type definition in parentheses */
 #endif
 
 #  pragma warning(disable:4115) /* named type definition in parentheses */
 #endif
 
+/* This needs to be before the wx/defs/h inclusion
+ * for some reason
+ */
+
+#ifdef __WXWINCE__
+#include <windows.h>
+#endif
+
 #ifndef __GSOCKET_STANDALONE__
 #include "wx/defs.h"
 #include "wx/setup.h"
 #ifndef __GSOCKET_STANDALONE__
 #include "wx/defs.h"
 #include "wx/setup.h"
 
 #endif /* __GSOCKET_STANDALONE__ */
 
 
 #endif /* __GSOCKET_STANDALONE__ */
 
+#ifndef __WXWINCE__
 #include <assert.h>
 #include <assert.h>
+#else
+#define assert(x)
+#include <winsock.h>
+#include "wx/msw/wince/net.h"
+#endif
+
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
index 35ae44254afa804fec8626dd94b56ae5e417e23c..2ce7da19565afc076e16aae68913ab62d31146ab 100644 (file)
@@ -36,7 +36,7 @@
 #include "wx/msw/private.h"     // includes <windows.h>
 #include "wx/msw/missing.h"     // CHARSET_HANGUL
 
 #include "wx/msw/private.h"     // includes <windows.h>
 #include "wx/msw/missing.h"     // CHARSET_HANGUL
 
-#ifdef __GNUWIN32_OLD__
+#if defined(__GNUWIN32_OLD__) || defined(__WXWINCE__)
     // apparently we need to include winsock.h to get WSADATA and other stuff
     // used in wxGetFullHostName() with the old mingw32 versions
     #include <winsock.h>
     // apparently we need to include winsock.h to get WSADATA and other stuff
     // used in wxGetFullHostName() with the old mingw32 versions
     #include <winsock.h>
@@ -158,7 +158,6 @@ bool wxGetFullHostName(wxChar *buf, int maxSize)
     // shouldn't use winsock.dll (a.k.a. ws2_32.dll) at all so only use this
     // code if we link with it anyhow
 #if wxUSE_SOCKETS
     // shouldn't use winsock.dll (a.k.a. ws2_32.dll) at all so only use this
     // code if we link with it anyhow
 #if wxUSE_SOCKETS
-
     WSADATA wsa;
     if ( WSAStartup(MAKEWORD(1, 1), &wsa) == 0 )
     {
     WSADATA wsa;
     if ( WSAStartup(MAKEWORD(1, 1), &wsa) == 0 )
     {
diff --git a/src/msw/wince/net.cpp b/src/msw/wince/net.cpp
new file mode 100644 (file)
index 0000000..7891b54
--- /dev/null
@@ -0,0 +1,167 @@
+// Copyright 1998, Ben Goetter.  All rights reserved.
+
+/*
+ patch holes in winsock 
+
+  WCE 2.0 lacks many of the 'database' winsock routines.
+  Stub just enough them for ss.dll.
+
+  getprotobynumber
+  getservbyport
+  getservbyname
+
+*/
+
+#include <windows.h>
+#include <tchar.h>
+#include <winsock.h>
+#include <string.h>
+#include "wx/msw/wince/net.h"
+
+
+#define CCH_MAX_PROTO 4
+
+static struct protoent RgProtoEnt[] =
+{
+ { "tcp", {NULL}, 6 },
+ { "udp", {NULL}, 17 },
+ { "icmp", {NULL}, 1 },
+ { "ip", {NULL}, 0 },
+ { NULL, {NULL}, 0 }
+};
+
+
+#define CCH_MAX_SERV 8
+
+// Ordered by most likely to be requested.
+// Assumes that a service available on different protocols
+// will use the same port number on each protocol.
+// Should that be no longer the case, 
+// remove the fFoundOnce code from getservbyXxx fcns.
+
+// This table keeps port numbers in host byte order.
+
+static struct servent RgServEnt[] =
+{
+ { "ftp", {NULL}, 21, "tcp" },
+ { "ftp-data", {NULL}, 20, "tcp" },
+ { "telnet", {NULL}, 23, "tcp" },
+ { "smtp", {NULL}, 25, "tcp" },
+ { "http", {NULL}, 80, "tcp" },
+ { "http", {NULL}, 80, "udp" },
+ { "pop", {NULL}, 109, "tcp" },
+ { "pop2", {NULL}, 109, "tcp" },
+ { "pop3", {NULL}, 110, "tcp" },
+ { "nntp", {NULL}, 119, "tcp" },
+ { "finger", {NULL}, 79, "tcp" },
+ /* include most of the simple TCP services for testing */
+ { "echo", {NULL}, 7, "tcp" },
+ { "echo", {NULL}, 7, "udp" },
+ { "discard", {NULL}, 9, "tcp" },
+ { "discard", {NULL}, 9, "udp" },
+ { "chargen", {NULL}, 19, "tcp" },
+ { "chargen", {NULL}, 19, "udp" },
+ { "systat", {NULL}, 11, "tcp" },
+ { "systat", {NULL}, 11, "udp" },
+ { "daytime", {NULL}, 13, "tcp" },
+ { "daytime", {NULL}, 13, "udp" },
+ { "netstat", {NULL}, 15, "tcp" },
+ { "qotd", {NULL}, 17, "tcp" },
+ { "qotd", {NULL}, 17, "udp" },
+ { NULL, {NULL}, 0, NULL }
+};
+
+// Since table kept in host byte order,
+// return this element to callers
+
+static struct servent ServEntReturn = {0};
+
+// Because CE doesn't have _stricmp - that's why.
+
+static void strcpyLC(char* szDst, const char* szSrc, int cch)
+{
+ int i;
+ char ch;
+ for (i = 0, ch = szSrc[i]; i < cch && ch != 0; ch = szSrc[++i])
+ {
+  szDst[i] = (ch >= 'A' && ch <= 'Z') ? (ch + ('a'-'A')) : ch;
+ } szDst[i] = 0;
+}
+
+
+struct servent * WINSOCKAPI getservbyport(int port, const char * proto)
+{
+
+ port = ntohs((unsigned short)port); // arrives in network byte order
+ struct servent *ps = &RgServEnt[0];
+ BOOL fFoundOnce = FALSE; // flag to short-circuit search through rest of db
+
+ // Make a lowercase version for comparison
+ // truncate to 1 char longer than any value in table
+ char szProtoLC[CCH_MAX_PROTO+2];
+ if (NULL != proto)
+  strcpyLC(szProtoLC, proto, CCH_MAX_PROTO+1);
+
+ while (NULL != ps->s_name)
+ {
+  if (port == ps->s_port)
+  {
+   fFoundOnce = TRUE;
+   if (NULL == proto || !strcmp(szProtoLC, ps->s_proto))
+   {
+    ServEntReturn = *ps;
+    ServEntReturn.s_port = htons(ps->s_port);
+    return &ServEntReturn;
+   }
+  }
+  else if (fFoundOnce)
+   break;
+  ++ps;
+ } return NULL;
+}
+
+
+struct servent * WINSOCKAPI getservbyname(const char * name,
+                                          const char * proto)
+{
+ struct servent *ps = &RgServEnt[0];
+ BOOL fFoundOnce = FALSE; // flag to short-circuit search through rest of db
+
+ // Make lowercase versions for comparisons
+ // truncate to 1 char longer than any value in table
+ char szNameLC[CCH_MAX_SERV+2];
+ strcpyLC(szNameLC, name, CCH_MAX_SERV+1);
+ char szProtoLC[CCH_MAX_PROTO+2];
+ if (NULL != proto)
+  strcpyLC(szProtoLC, proto, CCH_MAX_PROTO+1);
+
+ while (NULL != ps->s_name)
+ {
+  if (!strcmp(szNameLC, ps->s_name))
+  {
+   fFoundOnce = TRUE;
+   if (NULL == proto || !strcmp(szProtoLC, ps->s_proto))
+   {
+    ServEntReturn = *ps;
+    ServEntReturn.s_port = htons(ps->s_port);
+    return &ServEntReturn;
+   }
+  }
+  else if (fFoundOnce)
+   break;
+  ++ps;
+ } return NULL;
+}
+
+
+struct protoent * WINSOCKAPI getprotobynumber(int proto)
+{
+ struct protoent *pr = &RgProtoEnt[0];
+ while (NULL != pr->p_name)
+ {
+  if (proto == pr->p_proto)
+   return pr;
+  ++pr;
+ } return NULL;
+}
+