- Timestamp:
- Nov 19, 2006 2:59:13 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/branches/symbian/pjlib/src/pj/ioqueue_symbian.cpp
r789 r806 115 115 pj_ioqueue_key_t *key_; 116 116 CPjSocket *sock_; 117 const pj_ioqueue_callback *cb_;117 pj_ioqueue_callback cb_; 118 118 void *user_data_; 119 119 … … 156 156 const pj_ioqueue_callback *cb, void *user_data) 157 157 : CActive(CActive::EPriorityStandard), 158 ioqueue_(ioqueue), key_(key), sock_((CPjSocket*)sock), cb_(cb),158 ioqueue_(ioqueue), key_(key), sock_((CPjSocket*)sock), 159 159 user_data_(user_data), aBufferPtr_(NULL, 0), type_(TYPE_NONE) 160 160 { 161 pj_memcpy(&cb_, cb, sizeof(*cb)); 161 162 } 162 163 … … 166 167 CActiveScheduler::Add(this); 167 168 } 169 170 void HandleReadCompletion(); 171 CPjSocket *HandleAcceptCompletion(); 168 172 }; 169 173 … … 217 221 return PJ_EPENDING; 218 222 } else { 219 return PJ_RETURN_OS_ERROR(iStatus.Int()); 223 // Complete immediately (with success or error) 224 if (iStatus == KErrNone) { 225 *size = aBufferPtr_.Length(); 226 HandleReadCompletion(); 227 return PJ_SUCCESS; 228 } 229 else { 230 pending_data_.read_.op_key_ = NULL; 231 pending_data_.read_.addr_ = NULL; 232 pending_data_.read_.addrlen_ = NULL; 233 return PJ_RETURN_OS_ERROR(iStatus.Int()); 234 } 220 235 } 221 236 } … … 250 265 return PJ_EPENDING; 251 266 } else { 252 return PJ_RETURN_OS_ERROR(iStatus.Int()); 253 } 267 // Accept() completed immediately (with success or error). 268 if (iStatus == KErrNone) { 269 HandleAcceptCompletion(); 270 return PJ_SUCCESS; 271 } 272 else { 273 pending_data_.accept_.op_key_ = NULL; 274 pending_data_.accept_.new_sock_ = NULL; 275 pending_data_.accept_.local_ = NULL; 276 pending_data_.accept_.remote_ = NULL; 277 pending_data_.accept_.addrlen_ = NULL; 278 return PJ_RETURN_OS_ERROR(iStatus.Int()); 279 } 280 } 281 } 282 283 284 // 285 // Handle asynchronous RecvFrom() completion 286 // 287 void CIoqueueCallback::HandleReadCompletion() 288 { 289 if (pending_data_.read_.addr_) { 290 PjSymbianOS::Addr2pj(aAddress_, 291 *(pj_sockaddr_in*)pending_data_.read_.addr_); 292 pending_data_.read_.addr_ = NULL; 293 } 294 if (pending_data_.read_.addrlen_) { 295 *pending_data_.read_.addrlen_ = sizeof(pj_sockaddr_in); 296 pending_data_.read_.addrlen_ = NULL; 297 } 298 299 pending_data_.read_.op_key_ = NULL; 300 } 301 302 303 // 304 // Handle asynchronous Accept() completion. 305 // 306 CPjSocket *CIoqueueCallback::HandleAcceptCompletion() 307 { 308 CPjSocket *pjNewSock = new CPjSocket(blank_sock_); 309 310 if (pending_data_.accept_.new_sock_) { 311 *pending_data_.accept_.new_sock_ = (pj_sock_t)pjNewSock; 312 pending_data_.accept_.new_sock_ = NULL; 313 } 314 315 if (pending_data_.accept_.local_) { 316 TInetAddr aAddr; 317 pj_sockaddr_in *ptr_sockaddr; 318 319 blank_sock_.LocalName(aAddr); 320 ptr_sockaddr = (pj_sockaddr_in*)pending_data_.accept_.local_; 321 PjSymbianOS::Addr2pj(aAddr, *ptr_sockaddr); 322 pending_data_.accept_.local_ = NULL; 323 } 324 325 if (pending_data_.accept_.remote_) { 326 TInetAddr aAddr; 327 pj_sockaddr_in *ptr_sockaddr; 328 329 blank_sock_.RemoteName(aAddr); 330 ptr_sockaddr = (pj_sockaddr_in*)pending_data_.accept_.remote_; 331 PjSymbianOS::Addr2pj(aAddr, *ptr_sockaddr); 332 pending_data_.accept_.remote_ = NULL; 333 } 334 335 if (pending_data_.accept_.addrlen_) { 336 *pending_data_.accept_.addrlen_ = sizeof(pj_sockaddr_in); 337 pending_data_.accept_.addrlen_ = NULL; 338 } 339 340 return pjNewSock; 254 341 } 255 342 … … 275 362 // Handle failure condition 276 363 if (iStatus != KErrNone) { 277 cb_->on_read_complete(key_, op_key, 278 -PJ_RETURN_OS_ERROR(iStatus.Int())); 364 if (cb_.on_read_complete) { 365 cb_.on_read_complete( key_, op_key, 366 -PJ_RETURN_OS_ERROR(iStatus.Int())); 367 } 279 368 return; 280 369 } 281 370 282 if (pending_data_.read_.addr_) { 283 PjSymbianOS::Addr2pj(aAddress_, 284 *(pj_sockaddr_in*)pending_data_.read_.addr_); 285 pending_data_.read_.addr_ = NULL; 286 } 287 if (pending_data_.read_.addrlen_) { 288 *pending_data_.read_.addrlen_ = sizeof(pj_sockaddr_in); 289 pending_data_.read_.addrlen_ = NULL; 290 } 371 HandleReadCompletion(); 291 372 292 373 /* Call callback */ 293 cb_->on_read_complete(key_, op_key, aBufferPtr_.Length()); 374 if (cb_.on_read_complete) { 375 cb_.on_read_complete(key_, op_key, aBufferPtr_.Length()); 376 } 294 377 295 378 } else if (cur_type == TYPE_ACCEPT) { … … 306 389 if (pending_data_.accept_.new_sock_) 307 390 *pending_data_.accept_.new_sock_ = PJ_INVALID_SOCKET; 308 309 cb_->on_accept_complete(key_, op_key, PJ_INVALID_SOCKET, 310 -PJ_RETURN_OS_ERROR(iStatus.Int())); 391 392 if (cb_.on_accept_complete) { 393 cb_.on_accept_complete( key_, op_key, PJ_INVALID_SOCKET, 394 -PJ_RETURN_OS_ERROR(iStatus.Int())); 395 } 311 396 return; 312 397 } 313 398 314 CPjSocket *pjNewSock = new CPjSocket(blank_sock_); 315 316 if (pending_data_.accept_.new_sock_) { 317 *pending_data_.accept_.new_sock_ = (pj_sock_t)pjNewSock; 318 pending_data_.accept_.new_sock_ = NULL; 319 } 320 321 if (pending_data_.accept_.local_) { 322 TInetAddr aAddr; 323 pj_sockaddr_in *ptr_sockaddr; 324 325 blank_sock_.LocalName(aAddr); 326 ptr_sockaddr = (pj_sockaddr_in*)pending_data_.accept_.local_; 327 PjSymbianOS::Addr2pj(aAddr, *ptr_sockaddr); 328 pending_data_.accept_.local_ = NULL; 329 } 330 331 if (pending_data_.accept_.remote_) { 332 TInetAddr aAddr; 333 pj_sockaddr_in *ptr_sockaddr; 334 335 blank_sock_.RemoteName(aAddr); 336 ptr_sockaddr = (pj_sockaddr_in*)pending_data_.accept_.remote_; 337 PjSymbianOS::Addr2pj(aAddr, *ptr_sockaddr); 338 pending_data_.accept_.remote_ = NULL; 339 } 340 341 if (pending_data_.accept_.addrlen_) { 342 *pending_data_.accept_.addrlen_ = sizeof(pj_sockaddr_in); 343 pending_data_.accept_.addrlen_ = NULL; 344 } 345 399 CPjSocket *pjNewSock = HandleAcceptCompletion(); 400 346 401 // Call callback. 347 cb_->on_accept_complete(key_, op_key, (pj_sock_t)pjNewSock, 348 PJ_SUCCESS); 402 if (cb_.on_accept_complete) { 403 cb_.on_accept_complete( key_, op_key, (pj_sock_t)pjNewSock, 404 PJ_SUCCESS); 405 } 349 406 } 350 407 … … 375 432 Cancel(); 376 433 377 if (cur_type == TYPE_READ) 378 cb_->on_read_complete(key_, op_key, bytes_status); 379 else if (cur_type == TYPE_ACCEPT) 434 if (cur_type == TYPE_READ) { 435 if (cb_.on_read_complete) 436 cb_.on_read_complete(key_, op_key, bytes_status); 437 } else if (cur_type == TYPE_ACCEPT) 380 438 ; 381 439 }
Note: See TracChangeset
for help on using the changeset viewer.