NS_IMETHODIMP
GetToStringStreamListener::OnStopRequest(nsIRequest *aRequest,
                                         nsISupports *aContext,
                                         nsresult aStatusCode)
{
    PRUint32 status, rv;
    nsCOMPtr<nsIHttpChannel> channel = do_QueryInterface(aContext);

    LOG(("OperationStreamListener::OnStopRequest() entered"));

    rv = channel ? channel->GetResponseStatus(&status) : NS_ERROR_UNEXPECTED;

    if (NS_FAILED(rv))
        return SignalCompletion(rv);

    if (status != 200)
        return SignalCompletion(status);

    nsCOMPtr<nsISupportsCString>
        suppString(do_CreateInstance("@mozilla.org/supports-cstring;1",
                                     &rv));
    NS_ENSURE_SUCCESS(rv, rv);
    suppString->SetData(mBody);

    SignalDetail(status, nsCAutoString(""), suppString);
    SignalCompletion(status);
    return NS_OK;
}
NS_IMETHODIMP
OperationStreamListener::OnStopRequest(nsIRequest *aRequest,
                                       nsISupports *aContext,
                                       nsresult aStatusCode)
{
    PRUint32 status, rv;
    nsCOMPtr<nsIHttpChannel> channel = do_QueryInterface(aContext);

    LOG(("OperationStreamListener::OnStopRequest() entered"));

    rv = channel ? channel->GetResponseStatus(&status) : NS_ERROR_UNEXPECTED;

    if (NS_FAILED(rv))
        return SignalCompletion(rv);

    if (status != 207)
        return SignalCompletion(status);

    // ZZZ Check content-length against mBody.Length()

    // Now we parse!
    nsCOMPtr<nsIDOMNodeList> responseList;
    PRUint32 length;
    rv = NS_WD_GetDocAndResponseListFromBuffer(mBody, getter_AddRefs(mXMLDoc),
                                               getter_AddRefs(responseList),
                                               &length);
    NS_ENSURE_SUCCESS(rv, SignalCompletion(rv));

    LOG(("found %d responses", length));
    
    for (PRUint32 i = 0; i < length; i++) {
        nsCOMPtr<nsIDOMNode> responseNode;
        rv = responseList->Item(i, getter_AddRefs(responseNode));
        NS_ENSURE_SUCCESS(rv, SignalCompletion(rv));

        nsCOMPtr<nsIDOMElement> responseElt =
            do_QueryInterface(responseNode, &rv);
        NS_ENSURE_SUCCESS(rv, SignalCompletion(rv));
    
        rv = ProcessResponse(responseElt);
        NS_ENSURE_SUCCESS(rv, SignalCompletion(rv));
    }

    SignalCompletion(status);
    return NS_OK;
}
void Driver::Event_Fallthrough(const EV::Event& event) {
    int accepted = 0;
    event.SetReturnPointer(&accepted);
	if(!(_activeOp && DispatchSingleEvent(_activeOp, event))) {
        if(_activeOp != _defaultOp) {
            GEN::Pointer<EV::Event> ftevent(event.Clone());
            ftevent->SetFallthrough(true);
            if(DispatchSingleEvent(_defaultOp, *ftevent)) {
                // default operator becomes active, implicit rebuild
                SetOperator(_defaultOp, false, NULL);
                // next, we have to resend the event without fallthrough flag
                accepted = 0;
                DispatchSingleEvent(_activeOp, event);
            }
        }
    }
    if(!accepted) {
        // forward event
        W::world.Send(event);
    }
    RebuildMeshes();
    SignalCompletion();
}
void Driver::Event_SetOperator(const SetOperatorEvent& event) {
    SetOperator(event.m_op, event.m_force, event.m_args);
    SignalCompletion();
}
void Driver::Event_RebuildAll(const EV::Event& event) {
    W::world.SendAndWait(ev_w_rebuildAll.Tag());
    SignalCompletion();
}