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