Okay, then we have it. Let's try to allow OnStopRequest's to precede
OnStartRequest's in the event that an error has occured before the
channel implementation has called OnStartRequest. It just requires a
bit more care on the part of the listener implementations, but that
should in general be a good thing anyways.
Darin
Judson Valeski wrote:
> Scott, talk to us about the docloader.
>
> Darin Fisher wrote:
>
>> Judson Valeski wrote:
>>
>>> Doug's got it :-). Rick Potts and I just got off the phone and he
>>> refreshed my memory a bit.
>>>
>>> The "original" semantics of nsIStreamObserver were such that OnStart
>>> was called to indicate that the data trying to be reached (the URI)
>>> had been reached (the file:// file had successfully ben fopen'd, the
>>> http:// host socket had been connected. the definition of "reach" is
>>> up to the transport). You'd get an OnStop indicating the transaction
>>> was complete (whether for connection failure reasons, data transport
>>> failure reasons (timeout)).
>>
>>
>>
>> Right, this makes sense. But, what if "the data trying to
>> be reached had [NOT] been reached?"
>
>
> If you resolve the server and connect (or open the file), you get an
> OnStart(). If you fail from that point forward (read timeout for
> example) you go straight to OnStop() w/ an error code. If the connect
> failed, you would not get an onstart, and you'd go straight to onstop.
>
>>> So, Darin, if we break the semantics of *always* coupling an OnStart
>>> w/ an OnStop, we can use OnStop to do what you're proposing. The
>>> consumer would only do setup type stuff in OnStart (w/ out fear of
>>> doing it for no good reason), and their OnStop would always check
>>> the nsresult passed in to decide whether or not to finish the
>>> transaction and clean up their init'd stuff.
>>
>>
>>
>> So you are suggesting that a particular set of nsresult
>> values would indicate failure _without_ the need to clean
>> up their init'd stuff? And, that another set of nsresult
>> values would indicate failure _with_ the need to clean up
>> their init'd stuff? This sounds complicated.
>
>
> No, that's up to the consumer's impl. Here's mine.
>
> judsimpl::OnStart() {
> // the transaction has "started"
> mMyPrivateData = new foo();
> }
>
> judsimpl::OnStop(..., status) {
>
> if (NS_FAILED(status)) {
> // shit hit the fan, if we had started the transaction, be sure to
> clean up.
> if (mMyPrivateData) {
> // transaction had started because my otherwise null private
> data has been allocated.
> delete mMyPrivateData;
> // do whatever else cleanup I need to do now that the
> transaction is over
> } else {
> // transaction never even started.
> // don't have to cleanup my init data.
> }
> } else {
> // all went well.
> if (mMyPrivateData) { // mMyPrivate data will always be non-null
> here, but I'm being safe.
> // transaction had started because my otherwise null private
> data has been allocated.
> delete mMyPrivateData;
> // do whatever else cleanup I need to do now that the
> transaction is over }
> return rv;
> }
>
> As you can see, you can almost ignore the status code in this case and
> just use the mMyPrivateData var as a boolean check as well. I'm not
> seeing any complexity here. nsresult codes already are broken into
> failure and non-failure ranges (macro'ized via NS_FAILED() &
> NS_SUCCEEDED())
>
>> Perhaps it would be just simpler for the listener to keep
>> track of whether or not OnStartRequest was called. This
>> need not be an explicit variable... the listener could
>> just check to see if something was init'd or not.
>
>
> lol. why oh why don't I read all my email before diving in :-). You
> got it! The error code can be useful though (say you wanted to throw a
> dialog indicating what the error was for example).
>
>>> We tried to enforce these semantics in the past and were pushed to
>>> provide the OnStart/OnStop coupling semantics, but we should
>>> probably move back to OnStart on successful "start" followed by
>>> OnStop (so OnStop can act alone).
>>
>>
>>
>> The problem, as I understand it, is that if we allow OnStop
>> acting alone, we are going to get many crashes... as the
>> code in the various OnStop's tend to assume OnStart has been
>> called. But, these could be considered bugs and then fixed.
>
>
> exactly!
>
>>> Scott,
>>> Does the docloader propegate OnStart's in failure cases? If so,
>>> do you think it's heavy to change that?
>>>
>>> Doug,
>>> Currently FTP fires OnStart's in error cases, we'd need to
>>> change that?
>>
>>
>>
>> HTTP does this too.
>
>
> we'd need to clean that up too obviously.
>
> Jud
>