Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Side by Side Diff: runtime/bin/socket.cc

Issue 9720045: Extend dart:io error handling to all socket functions (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed review comments Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "bin/socket.h" 5 #include "bin/socket.h"
6 #include "bin/dartutils.h" 6 #include "bin/dartutils.h"
7 #include "bin/thread.h" 7 #include "bin/thread.h"
8 #include "bin/utils.h" 8 #include "bin/utils.h"
9 #include "platform/thread.h" 9 #include "platform/thread.h"
10 #include "platform/utils.h" 10 #include "platform/utils.h"
11 11
12 #include "include/dart_api.h" 12 #include "include/dart_api.h"
13 13
14 dart::Mutex Socket::mutex_; 14 dart::Mutex Socket::mutex_;
15 int Socket::service_ports_size_ = 0; 15 int Socket::service_ports_size_ = 0;
16 Dart_Port* Socket::service_ports_ = NULL; 16 Dart_Port* Socket::service_ports_ = NULL;
17 int Socket::service_ports_index_ = 0; 17 int Socket::service_ports_index_ = 0;
18 18
19 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { 19 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) {
20 Dart_EnterScope(); 20 Dart_EnterScope();
21 Dart_Handle socketobj = Dart_GetNativeArgument(args, 0); 21 Dart_Handle socketobj = Dart_GetNativeArgument(args, 0);
22 const char* host = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); 22 const char* host = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
23 int64_t port = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2)); 23 int64_t port = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2));
24 intptr_t socket = Socket::CreateConnect(host, port); 24 intptr_t socket = Socket::CreateConnect(host, port);
25 DartUtils::SetIntegerField(socketobj, DartUtils::kIdFieldName, socket); 25 if (socket >= 0) {
26 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); 26 DartUtils::SetIntegerField(socketobj, DartUtils::kIdFieldName, socket);
27 Dart_SetReturnValue(args, Dart_True());
28 } else {
29 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
30 }
27 Dart_ExitScope(); 31 Dart_ExitScope();
28 } 32 }
29 33
30 34
31 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) { 35 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) {
32 Dart_EnterScope(); 36 Dart_EnterScope();
33 int64_t socket = DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), 37 int64_t socket = DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0),
34 DartUtils::kIdFieldName); 38 DartUtils::kIdFieldName);
35 intptr_t available = Socket::Available(socket); 39 intptr_t available = Socket::Available(socket);
36 Dart_SetReturnValue(args, Dart_NewInteger(available)); 40 Dart_SetReturnValue(args, Dart_NewInteger(available));
(...skipping 27 matching lines...) Expand all
64 intptr_t bytes_read = Socket::Read(socket, buffer, length); 68 intptr_t bytes_read = Socket::Read(socket, buffer, length);
65 if (bytes_read > 0) { 69 if (bytes_read > 0) {
66 Dart_Handle result = 70 Dart_Handle result =
67 Dart_ListSetAsBytes(buffer_obj, offset, buffer, bytes_read); 71 Dart_ListSetAsBytes(buffer_obj, offset, buffer, bytes_read);
68 if (Dart_IsError(result)) { 72 if (Dart_IsError(result)) {
69 delete[] buffer; 73 delete[] buffer;
70 Dart_PropagateError(result); 74 Dart_PropagateError(result);
71 } 75 }
72 } 76 }
73 delete[] buffer; 77 delete[] buffer;
74 Dart_SetReturnValue(args, Dart_NewInteger(bytes_read)); 78 if (bytes_read >= 0) {
79 Dart_SetReturnValue(args, Dart_NewInteger(bytes_read));
80 } else {
81 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
82 }
75 Dart_ExitScope(); 83 Dart_ExitScope();
76 } 84 }
77 85
78 86
79 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) { 87 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) {
80 Dart_EnterScope(); 88 Dart_EnterScope();
81 intptr_t socket = 89 intptr_t socket =
82 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), 90 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0),
83 DartUtils::kIdFieldName); 91 DartUtils::kIdFieldName);
84 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); 92 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1);
(...skipping 28 matching lines...) Expand all
113 chunk_length); 121 chunk_length);
114 if (Dart_IsError(result)) { 122 if (Dart_IsError(result)) {
115 delete[] buffer; 123 delete[] buffer;
116 Dart_PropagateError(result); 124 Dart_PropagateError(result);
117 } 125 }
118 bytes_written = 126 bytes_written =
119 Socket::Write(socket, reinterpret_cast<void*>(buffer), chunk_length); 127 Socket::Write(socket, reinterpret_cast<void*>(buffer), chunk_length);
120 total_bytes_written += bytes_written; 128 total_bytes_written += bytes_written;
121 } while (bytes_written > 0 && total_bytes_written < length); 129 } while (bytes_written > 0 && total_bytes_written < length);
122 delete[] buffer; 130 delete[] buffer;
123 Dart_SetReturnValue(args, Dart_NewInteger(total_bytes_written)); 131 if (bytes_written >= 0) {
132 Dart_SetReturnValue(args, Dart_NewInteger(total_bytes_written));
133 } else {
134 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
135 }
124 Dart_ExitScope(); 136 Dart_ExitScope();
125 } 137 }
126 138
127 139
128 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) { 140 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) {
129 Dart_EnterScope(); 141 Dart_EnterScope();
130 intptr_t socket = 142 intptr_t socket =
131 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), 143 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0),
132 DartUtils::kIdFieldName); 144 DartUtils::kIdFieldName);
145 OSError os_error;
133 intptr_t port = Socket::GetPort(socket); 146 intptr_t port = Socket::GetPort(socket);
134 Dart_SetReturnValue(args, Dart_NewInteger(port)); 147 if (port > 0) {
148 Dart_SetReturnValue(args, Dart_NewInteger(port));
149 } else {
150 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
151 }
135 Dart_ExitScope(); 152 Dart_ExitScope();
136 } 153 }
137 154
155
156 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) {
157 Dart_EnterScope();
158 intptr_t socket =
159 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0),
160 DartUtils::kIdFieldName);
161 OSError os_error;
162 Socket::GetError(socket, &os_error);
163 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
164 Dart_ExitScope();
165 }
166
138 167
139 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) { 168 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) {
140 Dart_EnterScope(); 169 Dart_EnterScope();
141 Dart_Handle socketobj = Dart_GetNativeArgument(args, 0); 170 Dart_Handle socketobj = Dart_GetNativeArgument(args, 0);
142 intptr_t num = 171 intptr_t num =
143 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); 172 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1));
144 ASSERT(num == 0 || num == 1 || num == 2); 173 ASSERT(num == 0 || num == 1 || num == 2);
145 intptr_t socket = Socket::GetStdioHandle(num); 174 intptr_t socket = Socket::GetStdioHandle(num);
146 DartUtils::SetIntegerField( 175 DartUtils::SetIntegerField(
147 socketobj, DartUtils::kIdFieldName, socket); 176 socketobj, DartUtils::kIdFieldName, socket);
148 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); 177 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0));
149 Dart_ExitScope(); 178 Dart_ExitScope();
150 } 179 }
151 180
152 181
153 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { 182 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) {
154 Dart_EnterScope(); 183 Dart_EnterScope();
155 Dart_Handle socketobj = Dart_GetNativeArgument(args, 0); 184 Dart_Handle socketobj = Dart_GetNativeArgument(args, 0);
156 const char* bindAddress = 185 const char* bindAddress =
157 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); 186 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
158 intptr_t port = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2)); 187 intptr_t port = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2));
159 intptr_t backlog = 188 intptr_t backlog =
160 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); 189 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3));
161 intptr_t socket = 190 intptr_t socket =
162 ServerSocket::CreateBindListen(bindAddress, port, backlog); 191 ServerSocket::CreateBindListen(bindAddress, port, backlog);
163 DartUtils::SetIntegerField( 192 if (socket >= 0) {
164 socketobj, DartUtils::kIdFieldName, socket); 193 DartUtils::SetIntegerField(
165 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); 194 socketobj, DartUtils::kIdFieldName, socket);
195 Dart_SetReturnValue(args, Dart_True());
196 } else {
197 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
198 }
166 Dart_ExitScope(); 199 Dart_ExitScope();
167 } 200 }
168 201
169 202
170 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { 203 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) {
171 Dart_EnterScope(); 204 Dart_EnterScope();
172 intptr_t socket = 205 intptr_t socket =
173 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0), 206 DartUtils::GetIntegerField(Dart_GetNativeArgument(args, 0),
174 DartUtils::kIdFieldName); 207 DartUtils::kIdFieldName);
175 Dart_Handle socketobj = Dart_GetNativeArgument(args, 1); 208 Dart_Handle socketobj = Dart_GetNativeArgument(args, 1);
176 intptr_t newSocket = ServerSocket::Accept(socket); 209 intptr_t newSocket = ServerSocket::Accept(socket);
177 if (newSocket >= 0) { 210 if (newSocket >= 0) {
178 DartUtils::SetIntegerField( 211 DartUtils::SetIntegerField(
179 socketobj, DartUtils::kIdFieldName, newSocket); 212 socketobj, DartUtils::kIdFieldName, newSocket);
213 Dart_SetReturnValue(args, Dart_True());
214 } else {
215 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
180 } 216 }
181 Dart_SetReturnValue(args, Dart_NewBoolean(newSocket >= 0));
182 Dart_ExitScope(); 217 Dart_ExitScope();
183 } 218 }
184 219
185 220
186 static CObject* LookupRequest(const CObjectArray& request) { 221 static CObject* LookupRequest(const CObjectArray& request) {
187 if (request.Length() == 2 && request[1]->IsString()) { 222 if (request.Length() == 2 && request[1]->IsString()) {
188 CObjectString host(request[1]); 223 CObjectString host(request[1]);
189 CObject* result = NULL; 224 CObject* result = NULL;
190 OSError* os_error = NULL; 225 OSError* os_error = NULL;
191 const char* ip_address = 226 const char* ip_address =
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 Dart_EnterScope(); 289 Dart_EnterScope();
255 Dart_SetReturnValue(args, Dart_Null()); 290 Dart_SetReturnValue(args, Dart_Null());
256 Dart_Port service_port = Socket::GetServicePort(); 291 Dart_Port service_port = Socket::GetServicePort();
257 if (service_port != kIllegalPort) { 292 if (service_port != kIllegalPort) {
258 // Return a send port for the service port. 293 // Return a send port for the service port.
259 Dart_Handle send_port = Dart_NewSendPort(service_port); 294 Dart_Handle send_port = Dart_NewSendPort(service_port);
260 Dart_SetReturnValue(args, send_port); 295 Dart_SetReturnValue(args, send_port);
261 } 296 }
262 Dart_ExitScope(); 297 Dart_ExitScope();
263 } 298 }
OLDNEW
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698