} else { gKeepRunning = 0; }
} else gKeepRunning = PR_FALSE;
main(int argc, char* argv[]){    nsresult rv;    // Create the Event Queue for this thread...    NS_WITH_SERVICE(nsIEventQueueService, eventQService, kEventQueueServiceCID, &rv);    if (NS_FAILED(rv)) return rv;    rv = eventQService->CreateThreadEventQueue();    if (NS_FAILED(rv)) return rv;    eventQService->GetThreadEventQueue(NS_CURRENT_THREAD, &gEventQ);    rv = nsComponentManager::AutoRegister(nsIComponentManager::NS_Startup, NULL /* default */);    if (NS_FAILED(rv)) return rv;    nsCOMPtr<nsICategoryManager> catman =        do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv);    if (NS_FAILED(rv)) return rv;    nsXPIDLCString previous;    ///////////////////////////////////////////    // BEGIN - Stream converter registration    //   All stream converters must register with the ComponentManager    ///////////////////////////////////////////    // these stream converters are just for testing. running this harness    // from the dist/bin dir will also pickup converters registered    // in other modules (necko converters for example).    PRUint32 converterListSize = 7;    char *converterList[] = {        "?from=a/foo&to=b/foo",        "?from=b/foo&to=c/foo",        "?from=b/foo&to=d/foo",        "?from=c/foo&to=d/foo",        "?from=d/foo&to=e/foo",        "?from=d/foo&to=f/foo",        "?from=t/foo&to=k/foo",    };    TestConverterFactory *convFactory = new TestConverterFactory(kTestConverterCID, "TestConverter", NS_ISTREAMCONVERTER_KEY);    nsCOMPtr<nsIFactory> convFactSup(do_QueryInterface(convFactory, &rv));    if (NS_FAILED(rv)) return rv;    PRUint32 count = 0;    while (count < converterListSize) {        // register the TestConverter with the component manager. One contractid registration        // per conversion pair (from - to pair).        nsCString contractID(NS_ISTREAMCONVERTER_KEY);        contractID.Append(converterList[count]);        rv = nsComponentManager::RegisterFactory(kTestConverterCID,                                                 "TestConverter",                                                 contractID.get(),                                                 convFactSup,                                                 PR_TRUE);        if (NS_FAILED(rv)) return rv;        rv = catman->AddCategoryEntry(NS_ISTREAMCONVERTER_KEY, converterList[count], "x",                                        PR_TRUE, PR_TRUE, getter_Copies(previous));        if (NS_FAILED(rv)) return rv;        count++;    }    NS_WITH_SERVICE(nsIStreamConverterService, StreamConvService, kStreamConverterServiceCID, &rv);    if (NS_FAILED(rv)) return rv;    // Define the *from* content type and *to* content-type for conversion.    nsString fromStr;    fromStr.AssignWithConversion("a/foo");    nsString toStr;    toStr.AssignWithConversion("c/foo");    #ifdef ASYNC_TEST    // ASYNCRONOUS conversion    // Build up a channel that represents the content we're    // starting the transaction with.    //    // sample multipart mixed content-type string:    // "multipart/x-mixed-replacE;boundary=thisrandomstring"    /*nsCOMPtr<nsIChannel> channel;    nsCOMPtr<nsIURI> dummyURI;    rv = NS_NewURI(getter_AddRefs(dummyURI), "http://meaningless");    if (NS_FAILED(rv)) return rv;    rv = NS_NewInputStreamChannel(getter_AddRefs(channel),                                  dummyURI,                                  nsnull,   // inStr                                  "text/plain", // content-type                                  -1);      // XXX fix contentLength    if (NS_FAILED(rv)) return rv;    nsCOMPtr<nsIRequest> request(do_QueryInterface(channel));*/    nsCOMPtr<nsIRequest> request;    // setup a listener to receive the converted data. This guy is the end    // listener in the chain, he wants the fully converted (toType) data.    // An example of this listener in mozilla would be the DocLoader.    nsIStreamListener *dataReceiver = new EndListener();    NS_ADDREF(dataReceiver);    // setup a listener to push the data into. This listener sits inbetween the    // unconverted data of fromType, and the final listener in the chain (in this case    // the dataReceiver.    nsIStreamListener *converterListener = nsnull;    rv = StreamConvService->AsyncConvertData(fromStr.GetUnicode(), toStr.GetUnicode(),                                              dataReceiver, nsnull, &converterListener);    if (NS_FAILED(rv)) return rv;    NS_RELEASE(dataReceiver);    // at this point we have a stream listener to push data to, and the one    // that will receive the converted data. Let's mimic On*() calls and get the conversion    // going. Typically these On*() calls would be made inside their respective wrappers On*()    // methods.    rv = converterListener->OnStartRequest(request, nsnull);    if (NS_FAILED(rv)) return rv;    rv = SEND_DATA("aaa");    if (NS_FAILED(rv)) return rv;        rv = SEND_DATA("aaa");    if (NS_FAILED(rv)) return rv;        // Finish the request.    rv = converterListener->OnStopRequest(request, nsnull, rv);    if (NS_FAILED(rv)) return rv;    NS_RELEASE(converterListener);#else    // SYNCRONOUS conversion    nsCOMPtr<nsIInputStream> convertedData;    rv = StreamConvService->Convert(inputData, fromStr.GetUnicode(), toStr.GetUnicode(),                                     nsnull, getter_AddRefs(convertedData));    if (NS_FAILED(rv)) return rv;#endif    // Enter the message pump to allow the URL load to proceed.    while ( gKeepRunning ) {#ifdef WIN32        MSG msg;        if (GetMessage(&msg, NULL, 0, 0)) {            TranslateMessage(&msg);            DispatchMessage(&msg);        } else {            gKeepRunning = 0;    }#else#ifdef XP_MAC    /* Mac stuff is missing here! */#else#ifdef XP_OS2    QMSG qmsg;    if (WinGetMsg(0, &qmsg, 0, 0, 0))      WinDispatchMsg(0, &qmsg);    else      gKeepRunning = FALSE;#else    PLEvent *gEvent;    rv = gEventQ->GetEvent(&gEvent);    rv = gEventQ->HandleEvent(gEvent);#endif /* XP_UNIX */#endif /* XP_OS2 */#endif /* !WIN32 */    }    //return NS_ShutdownXPCOM(NULL);}