24 #ifdef GRPC_CFSTREAM_CLIENT
26 #include <CoreFoundation/CoreFoundation.h>
27 #include <netinet/in.h>
47 struct CFStreamConnect {
51 CFReadStreamRef read_stream;
52 CFWriteStreamRef write_stream;
59 bool read_stream_open;
60 bool write_stream_open;
69 static void CFStreamConnectCleanup(CFStreamConnect* connect) {
70 CFSTREAM_HANDLE_UNREF(connect->stream_handle,
"async connect clean up");
71 CFRelease(connect->read_stream);
72 CFRelease(connect->write_stream);
78 CFStreamConnect* connect =
static_cast<CFStreamConnect*
>(
arg);
85 connect->closure = nil;
86 const bool done = (--connect->refs == 0);
91 CFStreamConnectCleanup(connect);
100 CFStreamConnect* connect =
static_cast<CFStreamConnect*
>(
arg);
108 connect->closure = nil;
110 bool done = (--connect->refs == 0);
117 CFStreamConnectCleanup(connect);
120 CFErrorRef stream_error = CFReadStreamCopyError(connect->read_stream);
121 if (stream_error == NULL) {
122 stream_error = CFWriteStreamCopyError(connect->write_stream);
125 error = GRPC_ERROR_CREATE_FROM_CFERROR(stream_error,
"connect() error");
126 CFRelease(stream_error);
129 *endpoint = grpc_cfstream_endpoint_create(
130 connect->read_stream, connect->write_stream,
131 connect->addr_name.c_str(), connect->stream_handle);
142 CFStringRef* host,
int*
port) {
147 *host = CFStringCreateWithCString(NULL, host_string.c_str(),
148 kCFStringEncodingUTF8);
158 if (!addr_uri.ok()) {
165 CFStreamConnect* connect =
new CFStreamConnect();
167 connect->endpoint = ep;
168 connect->addr_name = addr_uri.value();
175 connect, connect->addr_name.c_str());
178 CFReadStreamRef read_stream;
179 CFWriteStreamRef write_stream;
183 ParseResolvedAddress(resolved_addr, &host, &
port);
184 CFStreamCreatePairWithSocketToHost(NULL, host,
port, &read_stream,
187 connect->read_stream = read_stream;
188 connect->write_stream = write_stream;
189 connect->stream_handle =
190 CFStreamHandle::CreateStreamHandle(read_stream, write_stream);
192 grpc_schedule_on_exec_ctx);
193 connect->stream_handle->NotifyOnOpen(&connect->on_open);
195 grpc_schedule_on_exec_ctx);
197 CFReadStreamOpen(read_stream);
198 CFWriteStreamOpen(write_stream);
204 static bool CFStreamClientCancelConnect(
int64_t ) {
209 CFStreamClientConnect, CFStreamClientCancelConnect};