1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "webrtc/test/channel_transport/udp_socket_wrapper.h"
12
13 #include <stdlib.h>
14 #include <string.h>
15
16 #include "webrtc/system_wrappers/include/event_wrapper.h"
17 #include "webrtc/system_wrappers/include/trace.h"
18 #include "webrtc/test/channel_transport/udp_socket_manager_wrapper.h"
19
20 #if defined(_WIN32)
21 #include "webrtc/test/channel_transport/udp_socket2_win.h"
22 #else
23 #include "webrtc/test/channel_transport/udp_socket_posix.h"
24 #endif
25
26
27 namespace webrtc {
28 namespace test {
29
30 bool UdpSocketWrapper::_initiated = false;
31
32 // Temporary Android hack. The value 1024 is taken from
33 // <ndk>/build/platforms/android-1.5/arch-arm/usr/include/linux/posix_types.h
34 // TODO (tomasl): can we remove this now?
35 #ifndef FD_SETSIZE
36 #define FD_SETSIZE 1024
37 #endif
38
UdpSocketWrapper()39 UdpSocketWrapper::UdpSocketWrapper()
40 : _wantsIncoming(false),
41 _deleteEvent(NULL)
42 {
43 }
44
~UdpSocketWrapper()45 UdpSocketWrapper::~UdpSocketWrapper()
46 {
47 if(_deleteEvent)
48 {
49 _deleteEvent->Set();
50 _deleteEvent = NULL;
51 }
52 }
53
SetEventToNull()54 void UdpSocketWrapper::SetEventToNull()
55 {
56 if (_deleteEvent)
57 {
58 _deleteEvent = NULL;
59 }
60 }
61
CreateSocket(const int32_t id,UdpSocketManager * mgr,CallbackObj obj,IncomingSocketCallback cb,bool ipV6Enable,bool disableGQOS)62 UdpSocketWrapper* UdpSocketWrapper::CreateSocket(const int32_t id,
63 UdpSocketManager* mgr,
64 CallbackObj obj,
65 IncomingSocketCallback cb,
66 bool ipV6Enable,
67 bool disableGQOS)
68
69 {
70 WEBRTC_TRACE(kTraceMemory, kTraceTransport, id,
71 "UdpSocketWrapper::CreateSocket");
72
73 UdpSocketWrapper* s = 0;
74
75 #ifdef _WIN32
76 if (!_initiated)
77 {
78 WSADATA wsaData;
79 WORD wVersionRequested = MAKEWORD( 2, 2 );
80 int32_t err = WSAStartup( wVersionRequested, &wsaData);
81 if (err != 0)
82 {
83 WEBRTC_TRACE(
84 kTraceError,
85 kTraceTransport,
86 id,
87 "UdpSocketWrapper::CreateSocket failed to initialize sockets\
88 WSAStartup error:%d",
89 err);
90 return NULL;
91 }
92
93 _initiated = true;
94 }
95
96 s = new UdpSocket2Windows(id, mgr, ipV6Enable, disableGQOS);
97
98 #else
99 if (!_initiated)
100 {
101 _initiated = true;
102 }
103 s = new UdpSocketPosix(id, mgr, ipV6Enable);
104 if (s)
105 {
106 UdpSocketPosix* sl = static_cast<UdpSocketPosix*>(s);
107 if (sl->GetFd() != INVALID_SOCKET && sl->GetFd() < FD_SETSIZE)
108 {
109 // ok
110 } else
111 {
112 WEBRTC_TRACE(
113 kTraceError,
114 kTraceTransport,
115 id,
116 "UdpSocketWrapper::CreateSocket failed to initialize socket");
117 delete s;
118 s = NULL;
119 }
120 }
121 #endif
122 if (s)
123 {
124 s->_deleteEvent = NULL;
125 if (!s->SetCallback(obj, cb))
126 {
127 WEBRTC_TRACE(
128 kTraceError,
129 kTraceTransport,
130 id,
131 "UdpSocketWrapper::CreateSocket failed to ser callback");
132 return(NULL);
133 }
134 }
135 return s;
136 }
137
StartReceiving()138 bool UdpSocketWrapper::StartReceiving()
139 {
140 _wantsIncoming = true;
141 return true;
142 }
143
StartReceiving(const uint32_t)144 bool UdpSocketWrapper::StartReceiving(const uint32_t /*receiveBuffers*/) {
145 return StartReceiving();
146 }
147
StopReceiving()148 bool UdpSocketWrapper::StopReceiving()
149 {
150 _wantsIncoming = false;
151 return true;
152 }
153
SetPCP(const int32_t)154 int32_t UdpSocketWrapper::SetPCP(const int32_t /*pcp*/) { return -1; }
155
ReceiveBuffers()156 uint32_t UdpSocketWrapper::ReceiveBuffers() { return 0; }
157
158 } // namespace test
159 } // namespace webrtc
160