X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/03e11df5470fd64d9d9a669d0b50b84c2d714736..33754c4d83c59b7523a6da0c4fb21079cb60301c:/src/mac/gsocket.c diff --git a/src/mac/gsocket.c b/src/mac/gsocket.c index 9a6a0596b1..ef89f1a511 100644 --- a/src/mac/gsocket.c +++ b/src/mac/gsocket.c @@ -19,11 +19,8 @@ #if wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) -#define OTUNIXERRORS 1 -#ifdef __UNIX__ - #include - #include - #include +#ifdef __DARWIN__ + #include #ifndef FALSE #define FALSE 0 @@ -32,6 +29,7 @@ #define TRUE 1 #endif #else + #define OTUNIXERRORS 1 #include #include #include @@ -82,11 +80,11 @@ void wxCYield() ; #define qDebug2 1 extern pascal void OTDebugStr(const char* str); #endif -#ifndef __UNIX__ +#ifndef __DARWIN__ #include #endif InetSvcRef gInetSvcRef = 0 ; - +int gOTInited = 0 ; OSStatus DoNegotiateIPReuseAddrOption(EndpointRef ep, Boolean enableReuseIPMode); @@ -123,7 +121,11 @@ OSStatus DoNegotiateIPReuseAddrOption(EndpointRef ep, Boolean enableReuseIPMode) ret.opt.maxlen = kOTFourByteOptionSize; opt->level = INET_IP; // dealing with an IP Level function +#ifdef __DARWIN__ + opt->name = kIP_REUSEADDR; +#else opt->name = IP_REUSEADDR; +#endif opt->len = kOTFourByteOptionSize; opt->status = 0; *(UInt32*)opt->value = enableReuseIPMode; // set the desired option level, true or false @@ -193,39 +195,66 @@ static void SetDefaultEndpointModes(EndpointRef ep , void *data ) int GSocket_Init() { - OSStatus err ; + return TRUE; +} + +int GSocket_Verify_Inited() ; +int GSocket_Verify_Inited() +{ + OSStatus err ; #if TARGET_CARBON - InitOpenTransportInContext( kInitOTForApplicationMask , NULL ) ; + // Marc Newsam: added the clientcontext variable + // however, documentation is unclear how this works + OTClientContextPtr clientcontext; + + if ( gInetSvcRef ) + return TRUE ; + + InitOpenTransportInContext(kInitOTForApplicationMask, &clientcontext); + gOTInited = 1 ; + gInetSvcRef = OTOpenInternetServicesInContext(kDefaultInternetServicesPath, + NULL, &err, clientcontext); #else - InitOpenTransport() ; + if ( gInetSvcRef ) + return TRUE ; + + InitOpenTransport() ; + gOTInited = 1 ; + gInetSvcRef = OTOpenInternetServices(kDefaultInternetServicesPath, NULL, &err); #endif - gInetSvcRef = OTOpenInternetServices(kDefaultInternetServicesPath, NULL, &err); - if ( gInetSvcRef == NULL || err != kOTNoError ) - { - OTAssert("Could not open Inet Services", err == noErr); - return FALSE ; - } - return TRUE; + if ( gInetSvcRef == NULL || err != kOTNoError ) + { + OTAssert("Could not open Inet Services", err == noErr); + return FALSE ; + } + return TRUE ; } void GSocket_Cleanup() { - if ( gInetSvcRef != NULL ) - OTCloseProvider( gInetSvcRef ); -#if TARGET_CARBON - CloseOpenTransportInContext( NULL ) ; -#else - CloseOpenTransport() ; -#endif + if ( gOTInited != 0 ) + { + if ( gInetSvcRef != NULL ) + OTCloseProvider( gInetSvcRef ); + #if TARGET_CARBON + CloseOpenTransportInContext( NULL ) ; + #else + CloseOpenTransport() ; + #endif + } } /* Constructors / Destructors for GSocket */ GSocket *GSocket_new() { + int i; GSocket *socket; + if ( GSocket_Verify_Inited() == FALSE ) + return NULL ; + socket = (GSocket *)malloc(sizeof(GSocket)); if (socket == NULL) @@ -243,8 +272,8 @@ GSocket *GSocket_new() socket->m_server = FALSE; socket->m_stream = TRUE; socket->m_non_blocking = FALSE; - socket->m_timeout = 10*60*1000; - /* 10 minutes * 60 sec * 1000 millisec */ + socket->m_timeout = 1*1000; + /* 10 sec * 1000 millisec */ socket->m_takesEvents = TRUE ; socket->m_mac_events = wxMacGetNotifierTable() ; return socket; @@ -950,7 +979,9 @@ void GSocket_SetTimeout(GSocket *socket, unsigned long millisec) { assert(socket != NULL); - socket->m_timeout = millisec; +// this is usually set too high and we have not yet been able to detect a closed +// stream, thus we leave the 10 sec timeout +// socket->m_timeout = millisec; } /* GSocket_GetError: @@ -1043,9 +1074,11 @@ int _GSocket_Recv_Stream(GSocket *socket, char *buffer, int size) { OTFlags flags ; OTResult res ; + OTByteCount sz = 0 ; - size_t sz = 0 ; OTCountDataBytes( socket->m_endpoint , &sz ) ; + if ( size > sz ) + size = sz ; res = OTRcv( socket->m_endpoint , buffer , size , &flags ) ; if ( res < 0 ) { @@ -1055,7 +1088,7 @@ int _GSocket_Recv_Stream(GSocket *socket, char *buffer, int size) // we simulate another read event if there are still bytes if ( socket->m_takesEvents ) { - size_t sz = 0 ; + OTByteCount sz = 0 ; OTCountDataBytes( socket->m_endpoint , &sz ) ; if ( sz > 0 ) { @@ -1241,6 +1274,8 @@ GSocketError _GAddress_translate_from(GAddress *address, GSocketError _GAddress_translate_to(GAddress *address, InetAddress *addr) { + if ( GSocket_Verify_Inited() == FALSE ) + return GSOCK_IOERR ; memset(addr, 0 , sizeof(struct InetAddress)); OTInitInetAddress( addr , address->m_port , address->m_host ) ; return GSOCK_NOERROR; @@ -1265,6 +1300,9 @@ GSocketError GAddress_INET_SetHostName(GAddress *address, const char *hostname) InetHostInfo hinfo ; OSStatus ret ; + if ( GSocket_Verify_Inited() == FALSE ) + return GSOCK_IOERR ; + assert(address != NULL); CHECK_ADDRESS(address, INET, GSOCK_INVADDR); @@ -1361,11 +1399,13 @@ GSocketError GAddress_INET_SetPort(GAddress *address, unsigned short port) GSocketError GAddress_INET_GetHostName(GAddress *address, char *hostname, size_t sbuf) { InetDomainName name ; + if ( GSocket_Verify_Inited() == FALSE ) + return GSOCK_IOERR ; assert(address != NULL); CHECK_ADDRESS(address, INET, GSOCK_INVADDR); - OTInetAddressToName( gInetSvcRef , address->m_host , &name ) ; + OTInetAddressToName( gInetSvcRef , address->m_host , name ) ; strncpy( hostname , name , sbuf ) ; return GSOCK_NOERROR; } @@ -1397,7 +1437,7 @@ void _GSocket_Enable_Events(GSocket *socket) state = OTGetEndpointState(socket->m_endpoint); { - size_t sz = 0 ; + OTByteCount sz = 0 ; OTCountDataBytes( socket->m_endpoint , &sz ) ; if ( state == T_INCON || sz > 0 ) { @@ -1437,8 +1477,8 @@ GSocketError _GSocket_Input_Timeout(GSocket *socket) while( (now.hi * 4294967296.0 + now.lo) - (start.hi * 4294967296.0 + start.lo) < socket->m_timeout * 1000.0 ) { OTResult state ; - size_t sz = 0 ; - state = OTGetEndpointState(socket->m_endpoint); + OTByteCount sz = 0 ; + state = OTGetEndpointState(socket->m_endpoint); OTCountDataBytes( socket->m_endpoint , &sz ) ; if ( state == T_INCON || sz > 0 )