I can't figure out how to get a simple async listen loop going. I can
put a breakpoint in the socket code and see the accept happen and a
message for it gets queued. By this message does not end up calling my
OnSocketAccepted() function.

I see that there are two threads running, the main one and one
automatically created when I made the ServerSocket. The Accept event
is occurring on the second thread. I'm running the event pump on the
main thread. Do I also need to pump this secondary thread?

Is this secondary thread necessary? My app has no UI so it doesn't
need a UI thread.

--
Jon Smirl
[EMAIL PROTECTED]


int
main(void)
{
    nsresult rv;
    Server server;

    XPCOMGlueStartup(nsnull);

    // Initialize XPCOM
    nsCOMPtr<nsIServiceManager> servMan;
    rv = NS_InitXPCOM2(getter_AddRefs(servMan), nsnull, nsnull);
    if (NS_FAILED(rv))
    {
        printf("ERROR: XPCOM intialization error [%x].\n", rv);
        return -1;
    }
    // register all components in our default component directory
    nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface(servMan);
    NS_ASSERTION(registrar, "Null nsIComponentRegistrar");
    registrar->AutoRegister(nsnull);

    manager = do_QueryInterface(registrar);
    NS_ASSERTION(registrar, "Null nsIComponentManager");

    nsCOMPtr<nsIEventQueueService> eqs;
    rv = manager->CreateInstanceByContractID(NS_EVENTQUEUESERVICE_CONTRACTID,
                                             nsnull,
                                             NS_GET_IID(nsIEventQueueService),
                                             getter_AddRefs(eqs));

    nsCOMPtr<nsIEventQueue> eq;
    eqs->GetThreadEventQueue(NS_CURRENT_THREAD, getter_AddRefs(eq));

    server.init();

    eq->EventLoop();

    // process any remaining events before exiting
    eq->ProcessPendingEvents();
    eq->StopAcceptingEvents();
    eq->ProcessPendingEvents();

    // All nsCOMPtr's must be deleted prior to calling shutdown XPCOM
    // as we should not hold references passed XPCOM Shutdown.
    eq = 0;
    eqs = 0;
    servMan = 0;
    registrar = 0;
    manager = 0;

    // Shutdown XPCOM
    NS_ShutdownXPCOM(nsnull);

    XPCOMGlueShutdown();
    return 0;
}


// async_listener waits for a connection and
// responds to input from the network.
// The order of action is listen, accept connection, wait
// for 'GET', deliver payload, quit
class AsyncListener : public nsIServerSocketListener {
public:
  NS_DECL_ISUPPORTS
  NS_DECL_NSISERVERSOCKETLISTENER
};
NS_IMPL_ISUPPORTS1(AsyncListener, nsIServerSocketListener)

         // called after connection established
nsresult AsyncListener::OnSocketAccepted(nsIServerSocket *aServ,
nsISocketTransport *aTransport) {
  nsresult rv;
  nsCOMPtr<nsIInputStream> instream;
  nsCOMPtr<nsIOutputStream> outstream;
  StreamListener* stream_listener = new StreamListener();

  aTransport->OpenInputStream(0, 0, 0, getter_AddRefs(instream));
  aTransport->OpenOutputStream(0, 0, 0, getter_AddRefs(outstream));
  stream_listener->init(instream, outstream);

   // pump takes in data in chunks asynchronously
  nsCOMPtr<nsIInputStreamPump> pump;
  rv = manager->CreateInstanceByContractID(NS_INPUTSTREAMPUMP_CONTRACTID,
                                           nsnull,
                                           NS_GET_IID(nsIInputStreamPump),
                                           getter_AddRefs(pump));
  if (NS_FAILED(rv)) return rv;

  pump->Init(instream, -1, -1, 0, 0, false);
  pump->AsyncRead(NS_STATIC_CAST(nsIStreamListener*, stream_listener), NULL);
  return rv;
}

nsresult Server::init(void) {
  nsresult rv;

  rv = manager->CreateInstanceByContractID(NS_SERVERSOCKET_CONTRACTID,
                                           nsnull,
                                           NS_GET_IID(nsIServerSocket),
                                           getter_AddRefs(server));

  rv = server->Init(8869,  true, -1);
  rv = server->AsyncListen(new AsyncListener());
  return rv;
}
_______________________________________________
dev-tech-network mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-network

Reply via email to