bool mupnp_http_server_start(mUpnpHttpServer *httpServer) { mupnp_log_debug_l4("Entering...\n"); if (httpServer->acceptThread != NULL) return false; httpServer->acceptThread = mupnp_thread_new(); mupnp_thread_setaction(httpServer->acceptThread, mupnp_http_server_thread); mupnp_thread_setuserdata(httpServer->acceptThread, httpServer); /**** Thanks for Makela Aapo (10/31/05) ****/ httpServer->clientThreads = mupnp_threadlist_new(); if (mupnp_thread_start(httpServer->acceptThread) == false) { mupnp_thread_delete(httpServer->acceptThread); httpServer->acceptThread = NULL; /**** Thanks for Makela Aapo (10/31/05) ****/ mupnp_threadlist_delete(httpServer->clientThreads); httpServer->clientThreads = NULL; return false; } mupnp_log_debug_l4("Leaving...\n"); return true; }
void mupnp_service_createnotifyallthread(mUpnpService* service, mUpnpTime waitTime) { mUpnpThread* thread; thread = mupnp_thread_new(); mupnp_thread_setaction(thread, mupnp_service_notifyall_thread); mupnp_thread_setuserdata(thread, service); mupnp_wait(waitTime); mupnp_thread_start(thread); }
bool mupnp_ssdpresponse_server_start(mUpnpSSDPResponseServer* server) { mupnp_log_debug_l4("Entering...\n"); if (server->recvThread != NULL) return false; server->recvThread = mupnp_thread_new(); mupnp_thread_setaction(server->recvThread, mupnp_ssdpresponse_server_thread); mupnp_thread_setuserdata(server->recvThread, server); if (mupnp_thread_start(server->recvThread) == false) { mupnp_thread_delete(server->recvThread); server->recvThread = NULL; return false; } return true; mupnp_log_debug_l4("Leaving...\n"); }
static void mupnp_http_server_thread(mUpnpThread *thread) { mUpnpHttpServer *httpServer; mUpnpThread *httpClientThread; mUpnpHttpServerClientData *clientData; mUpnpSocket *serverSock; mUpnpSocket *clientSock; mupnp_log_debug_l4("Entering...\n"); httpServer = (mUpnpHttpServer *)mupnp_thread_getuserdata(thread); if (mupnp_http_server_isopened(httpServer) == false) return; serverSock = httpServer->sock; while (mupnp_thread_isrunnable(thread) == true) { clientSock = mupnp_socket_stream_new(); if (mupnp_socket_accept(serverSock, clientSock) == false) { mupnp_socket_delete(clientSock); break; } mupnp_socket_settimeout(clientSock, mupnp_http_server_gettimeout(httpServer)); clientData = mupnp_http_server_clientdata_new(httpServer, clientSock); httpClientThread = mupnp_thread_new(); mupnp_thread_setaction(httpClientThread, mupnp_http_server_clientthread); mupnp_thread_setuserdata(httpClientThread, clientData); /**** Thanks for Makela Aapo (10/31/05) ****/ mupnp_http_server_lock(httpServer); mupnp_threadlist_add(httpServer->clientThreads, httpClientThread); mupnp_http_server_unlock(httpServer); mupnp_thread_start(httpClientThread); } mupnp_log_debug_l4("Leaving...\n"); }
/** * Activate the control point. Starts listening for SSDP messages etc. * You must call this function before you can actually use a control point. * * @param ctrlPoint The control point to start * * @return true if successful; otherwise false * */ bool mupnp_controlpoint_start(mUpnpControlPoint *ctrlPoint) { mUpnpHttpServerList *httpServerList; MUPNP_HTTP_LISTENER httpListener; int httpEventPort; mUpnpSSDPServerList *ssdpServerList; mUpnpSSDPResponseServerList *ssdpResServerList; int ssdpResPort; int ssdpMaxResPort; mupnp_log_debug_l4("Entering...\n"); mupnp_controlpoint_stop(ctrlPoint); /* Expiration handling */ mupnp_thread_start(ctrlPoint->expThread); /**** Cache current interfaces ****/ mupnp_net_gethostinterfaces(ctrlPoint->ifCache); /**** HTTP Server ****/ httpEventPort = mupnp_controlpoint_geteventport(ctrlPoint); httpServerList = mupnp_controlpoint_gethttpserverlist(ctrlPoint); /* Opening HTTP server may fail, so try many ports */ while(mupnp_http_serverlist_open(httpServerList, httpEventPort) == false) { mupnp_controlpoint_seteventport(ctrlPoint, httpEventPort + 1); httpEventPort = mupnp_controlpoint_geteventport(ctrlPoint); } mupnp_http_serverlist_setuserdata(httpServerList, ctrlPoint); httpListener = mupnp_controlpoint_gethttplistener(ctrlPoint); if (httpListener == NULL) httpListener = mupnp_controlpoint_httprequestreceived; mupnp_http_serverlist_setlistener(httpServerList, httpListener); mupnp_http_serverlist_start(httpServerList); /**** SSDP Server ****/ ssdpServerList = mupnp_controlpoint_getssdpserverlist(ctrlPoint); if (mupnp_ssdp_serverlist_open(ssdpServerList) == false) return false; mupnp_ssdp_serverlist_setlistener(ssdpServerList, mupnp_controlpoint_ssdplistner); mupnp_ssdp_serverlist_setuserdata(ssdpServerList, ctrlPoint); if (mupnp_ssdp_serverlist_start(ssdpServerList) == false) return false; /**** SSDP Response Server ****/ ssdpResPort = mupnp_controlpoint_getssdpresponseport(ctrlPoint); /* below is the max SSDP Response port number to assign (rosfran.borges) */ ssdpMaxResPort = ssdpResPort + MUPNP_CONTROLPOINT_SSDP_RESPONSE_PORT_MAX_TRIES_INDEX; ssdpResServerList = mupnp_controlpoint_getssdpresponseserverlist(ctrlPoint); /* Opening SSDP response server may fail, so try many ports */ while(mupnp_ssdpresponse_serverlist_open(ssdpResServerList, ssdpResPort) == false && (ssdpResPort < ssdpMaxResPort) ) { mupnp_controlpoint_setssdpresponseport(ctrlPoint, ssdpResPort + 1); ssdpResPort = mupnp_controlpoint_getssdpresponseport(ctrlPoint); } mupnp_ssdpresponse_serverlist_setlistener(ssdpResServerList, mupnp_controlpoint_ssdpresponselistner); mupnp_ssdpresponse_serverlist_setuserdata(ssdpResServerList, ctrlPoint); if (mupnp_ssdpresponse_serverlist_start(ssdpResServerList) == false) return false; mupnp_log_debug_l4("Leaving...\n"); return true; }