Hi Matt, Thanks for the bug report and fix. It would help if you could file an issue in JIRA at https://issues.apache.org/jira/browse/THRIFT and attach your patch as a diff there, where you can sign over the license to Apache.
Michael On Wed, Jul 1, 2009 at 9:39 PM, Matt Ronge<[email protected]> wrote: > Hello, > > I've been working with the Cocoa bindings and I came across a bug today. > When writing a chunk of data greater than a certain size (in my case a > couple hundred kilobytes), NSOutputStream can't write the data in one chunk. > The existing code detects this and throws an exception, so it is impossible > to send a struct greater than a certain size. I've fixed this limitation in > the Obj-c code so that it loops until all of the data has been sent. > > I didn't see anything on how to contribute, and what the policy is, so I've > included the diff in this e-mail. How should I proceed? > > Index: TNSStreamTransport.m > =================================================================== > --- TNSStreamTransport.m (revision 790427) > +++ TNSStreamTransport.m (working copy) > @@ -65,17 +65,26 @@ > } > > > -// FIXME:geech:20071019 - make this write all > - (void) write: (uint8_t *) data offset: (unsigned int) offset length: > (unsigned int) length > { > - int result = [mOutput write: data+offset maxLength: length]; > - if (result == -1) { > - �...@throw [TTransportException exceptionWithReason: @"Error writing to > transport output stream." > - error: [mOutput > streamError]]; > - } else if (result == 0) { > - �...@throw [TTransportException exceptionWithReason: @"End of output > stream."]; > - } else if (result != length) { > - �...@throw [TTransportException exceptionWithReason: @"Output stream did > not write all of our data."]; > + int result = 0; > + // Loops until all the data is sent > + while (1) { > + result = [mOutput write: data+offset maxLength: length]; > + if (result == -1) { > + �...@throw [TTransportException exceptionWithReason: @"Error writing to > transport output stream." > + error: [mOutput > streamError]]; > + } else if (result == 0) { > + �...@throw [TTransportException exceptionWithReason: @"End of output > stream."]; > + } > + if (result == length) { > + break; > + } else { > + // result < length so not all the data was sent. > + // slide the offset along and send more data > + offset += result; > + length -= result; > + } > } > } > > -- > Matt Ronge > [email protected] > http://www.mronge.com > >
