@@ -161,14 +161,13 @@ @interface OFRunLoop_UDPSendQueueItem: OFRunLoop_QueueItem { @public # ifdef OF_HAVE_BLOCKS - of_udp_socket_async_send_block_t _block; + of_udp_socket_async_send_data_block_t _block; # endif - const void *_buffer; - size_t _length; + OFData *_data; of_socket_address_t _receiver; } @end #endif @@ -681,21 +680,21 @@ exception = e; } # ifdef OF_HAVE_BLOCKS if (_block != NULL) - return _block(object, _buffer, length, address, exception); + return _block(object, _buffer, length, &address, exception); else { # endif if (![_delegate respondsToSelector: @selector( socket:didReceiveIntoBuffer:length:sender:exception:)]) return false; return [_delegate socket: object didReceiveIntoBuffer: _buffer length: length - sender: address + sender: &address exception: exception]; # ifdef OF_HAVE_BLOCKS } # endif } @@ -712,51 +711,65 @@ @implementation OFRunLoop_UDPSendQueueItem - (bool)handleObject: (id)object { id exception = nil; + OFData *newData, *oldData; @try { - [object sendBuffer: _buffer - length: _length + [object sendBuffer: [_data items] + length: [_data count] * [_data itemSize] receiver: &_receiver]; } @catch (id e) { exception = e; } # ifdef OF_HAVE_BLOCKS if (_block != NULL) { - _length = _block(object, &_buffer, - (exception == nil ? _length : 0), &_receiver, exception); + newData = _block(object, _data, &_receiver, exception); - return (_length > 0); + if (newData == nil) + return false; + + oldData = _data; + _data = [newData copy]; + [oldData release]; + + return true; } else { # endif if (![_delegate respondsToSelector: - @selector(socket:didSendBuffer:length:receiver:exception:)]) + @selector(socket:didSendData:receiver:exception:)]) return false; - _length = [_delegate socket: object - didSendBuffer: &_buffer - length: (exception == nil ? _length : 0) + newData = [_delegate socket: object + didSendData: _data receiver: &_receiver exception: exception]; - return (_length > 0); + if (newData == nil) + return false; + + oldData = _data; + _data = [newData copy]; + [oldData release]; + + return true; # ifdef OF_HAVE_BLOCKS } # endif } -# ifdef OF_HAVE_BLOCKS - (void)dealloc { + [_data release]; +# ifdef OF_HAVE_BLOCKS [_block release]; +# endif [super dealloc]; } -# endif @end #endif @implementation OFRunLoop @synthesize currentMode = _currentMode; @@ -980,28 +993,27 @@ QUEUE_ITEM } + (void)of_addAsyncSendForUDPSocket: (OFUDPSocket *)sock - buffer: (const void *)buffer - length: (size_t)length - receiver: (of_socket_address_t)receiver + data: (OFData *)data + receiver: (const of_socket_address_t *)receiver mode: (of_run_loop_mode_t)mode # ifdef OF_HAVE_BLOCKS - block: (of_udp_socket_async_send_block_t)block + block: (of_udp_socket_async_send_data_block_t) + block # endif delegate: (id )delegate { NEW_WRITE(OFRunLoop_UDPSendQueueItem, sock, mode) queueItem->_delegate = [delegate retain]; # ifdef OF_HAVE_BLOCKS queueItem->_block = [block copy]; # endif - queueItem->_buffer = buffer; - queueItem->_length = length; - queueItem->_receiver = receiver; + queueItem->_data = [data copy]; + queueItem->_receiver = *receiver; QUEUE_ITEM } # undef NEW_READ # undef NEW_WRITE