/* * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "udp_socket_wrapper.h" #include #include #include "event_wrapper.h" #include "trace.h" #include "udp_socket_manager_wrapper.h" #if defined(_WIN32) #include "udp_socket_windows.h" #include "udp_socket2_windows.h" #else #include "udp_socket_linux.h" #endif namespace webrtc { bool UdpSocketWrapper::_initiated = false; // Temporary Android hack. The value 1024 is taken from // /build/platforms/android-1.5/arch-arm/usr/include/linux/posix_types.h // TODO (tomasl): can we remove this now? #ifndef FD_SETSIZE #define FD_SETSIZE 1024 #endif UdpSocketWrapper::UdpSocketWrapper() : _deleteEvent(NULL) { } UdpSocketWrapper::~UdpSocketWrapper() { if(_deleteEvent) { _deleteEvent->Set(); _deleteEvent = NULL; } } void UdpSocketWrapper::SetEventToNull() { if (_deleteEvent) { _deleteEvent = NULL; } } #ifdef USE_WINSOCK2 UdpSocketWrapper* UdpSocketWrapper::CreateSocket(const WebRtc_Word32 id, UdpSocketManager* mgr, CallbackObj obj, IncomingSocketCallback cb, bool ipV6Enable, bool disableGQOS) #else UdpSocketWrapper* UdpSocketWrapper::CreateSocket(const WebRtc_Word32 id, UdpSocketManager* mgr, CallbackObj obj, IncomingSocketCallback cb, bool ipV6Enable, bool /*disableGQOS*/) #endif { WEBRTC_TRACE(kTraceMemory, kTraceTransport, id, "UdpSocketWrapper::CreateSocket"); UdpSocketWrapper* s = 0; #ifdef _WIN32 if (!_initiated) { WSADATA wsaData; WORD wVersionRequested = MAKEWORD( 2, 2 ); WebRtc_Word32 err = WSAStartup( wVersionRequested, &wsaData); if (err != 0) { WEBRTC_TRACE( kTraceError, kTraceTransport, id, "UdpSocketWrapper::CreateSocket failed to initialize sockets\ WSAStartup error:%d", err); return NULL; } _initiated = true; } #ifdef USE_WINSOCK2 s = new UdpSocket2Windows(id, mgr, ipV6Enable, disableGQOS); #else #pragma message("Error: No non-Winsock2 implementation for WinCE") s = new UdpSocketWindows(id, mgr, ipV6Enable); #endif #else if (!_initiated) { _initiated = true; } s = new UdpSocketLinux(id, mgr, ipV6Enable); if (s) { UdpSocketLinux* sl = static_cast(s); if (sl->GetFd() != INVALID_SOCKET && sl->GetFd() < FD_SETSIZE) { // ok } else { WEBRTC_TRACE( kTraceError, kTraceTransport, id, "UdpSocketWrapper::CreateSocket failed to initialize socket"); delete s; s = NULL; } } #endif if (s) { s->_deleteEvent = NULL; if (!s->SetCallback(obj, cb)) { WEBRTC_TRACE( kTraceError, kTraceTransport, id, "UdpSocketWrapper::CreateSocket failed to ser callback"); return(NULL); } } return s; } bool UdpSocketWrapper::StartReceiving() { _wantsIncoming = true; return true; } bool UdpSocketWrapper::StopReceiving() { _wantsIncoming = false; return true; } } // namespace webrtc