Exemplo n.º 1
0
void mupnp_controlpoint_removedevicebyssdppacket(mUpnpControlPoint *ctrlPoint, mUpnpSSDPPacket *ssdpPkt)
{
	const char *usn;
	char udn[MUPNP_UDN_LEN_MAX];
	mUpnpDevice *dev;
	MUPNP_DEVICE_LISTENER listener = mupnp_controlpoint_getdevicelistener(ctrlPoint);
	
	mupnp_log_debug_l4("Entering...\n");

	usn = mupnp_ssdp_packet_getusn(ssdpPkt);
	mupnp_usn_getudn(usn, udn, sizeof(udn));
	
	mupnp_controlpoint_lock(ctrlPoint);
	
	dev = mupnp_controlpoint_getdevicebyudn(ctrlPoint, udn);

	if (dev == NULL) {
		mupnp_controlpoint_unlock(ctrlPoint);
		return;
	}
	
	if (listener != NULL)
	{
		mupnp_controlpoint_unlock(ctrlPoint);
		listener(ctrlPoint, udn, mUpnpDeviceStatusRemoved);
		mupnp_controlpoint_lock(ctrlPoint);
	}
	
	mupnp_device_delete(dev);
	
	mupnp_controlpoint_unlock(ctrlPoint);

	mupnp_log_debug_l4("Leaving...\n");
}
Exemplo n.º 2
0
void mupnp_controlpoint_adddevicebyssdppacket(mUpnpControlPoint* ctrlPoint, mUpnpSSDPPacket* ssdpPkt)
{
  mUpnpDevice* dev = NULL;
  const char* usn = NULL;
  char udn[MUPNP_UDN_LEN_MAX];
  MUPNP_DEVICE_LISTENER listener = NULL;
  mUpnpDeviceStatus status = 0;

  mupnp_log_debug_l4("Entering...\n");

  listener = mupnp_controlpoint_getdevicelistener(ctrlPoint);

  usn = mupnp_ssdp_packet_getusn(ssdpPkt);
  mupnp_usn_getudn(usn, udn, sizeof(udn));

  mupnp_controlpoint_lock(ctrlPoint);

  dev = mupnp_controlpoint_getdevicebyudn(ctrlPoint, udn);

  if (dev != NULL) {
    /* Device was found from local cache */
    if (mupnp_device_updatefromssdppacket(dev, ssdpPkt) == true) {
      mupnp_mutex_lock(ctrlPoint->expMutex);
      mupnp_cond_signal(ctrlPoint->expCond);
      mupnp_mutex_unlock(ctrlPoint->expMutex);

      /* Device was successfully updated */
      status = mUpnpDeviceStatusUpdated;
    }
    else { /* Problems occurred in device update */
      status = mUpnpDeviceStatusInvalid;
    }
  }
  else {
    /* This is a new device */
    dev = mupnp_controlpoint_createdevicefromssdkpacket(ssdpPkt);
    if (dev == NULL) {
      /* Problems occurred in device creation */
      status = mUpnpDeviceStatusInvalid;
    }
    else {
      mupnp_controlpoint_adddevice(ctrlPoint, dev);

      /* Device added, wake up expirationhandler thread */
      mupnp_mutex_lock(ctrlPoint->expMutex);
      mupnp_cond_signal(ctrlPoint->expCond);
      mupnp_mutex_unlock(ctrlPoint->expMutex);

      status = mUpnpDeviceStatusAdded;
    }
  }

  mupnp_controlpoint_unlock(ctrlPoint);

  if (listener != NULL) {
    listener(ctrlPoint, udn, status);
  }

  mupnp_log_debug_l4("Leaving...\n");
}
Exemplo n.º 3
0
/**
 * Stop the control point. Stops sending/receiveing/responding to any messages.
 *
 * @param ctrlPoint The control point to stop
 *
 * @return true if successful; otherwise false
 *
 */
bool mupnp_controlpoint_stop(mUpnpControlPoint *ctrlPoint)
{
	mUpnpDevice *dev = NULL;
	mUpnpSSDPServerList *ssdpServerList;
	mUpnpSSDPResponseServerList *ssdpResServerList;
	mUpnpHttpServerList *httpServerList;
	const char *udn = NULL;
	MUPNP_DEVICE_LISTENER listener = mupnp_controlpoint_getdevicelistener(ctrlPoint);
	
	mupnp_log_debug_l4("Entering...\n");

	/* Stop expiration handling */
	mupnp_thread_stop_with_cond(ctrlPoint->expThread, ctrlPoint->expCond);
	mupnp_log_debug_s("Expiration thread stopped.\n");
	
	/**** SSDP Server ****/
	ssdpServerList = mupnp_controlpoint_getssdpserverlist(ctrlPoint);
	mupnp_log_debug_s("Stopping ssdp servers.\n");
  mupnp_ssdp_serverlist_setlistener(ssdpServerList, NULL);
  mupnp_ssdp_serverlist_setuserdata(ssdpServerList, NULL);
	mupnp_ssdp_serverlist_stop(ssdpServerList);
	mupnp_log_debug_s("Done\n");
	mupnp_ssdp_serverlist_close(ssdpServerList);
	mupnp_ssdp_serverlist_clear(ssdpServerList);
	
	/**** SSDP Response Server ****/
	ssdpResServerList = mupnp_controlpoint_getssdpresponseserverlist(ctrlPoint);
	mupnp_log_debug_s("Stopping ssdp response servers.\n");
  mupnp_ssdpresponse_serverlist_setlistener(ssdpResServerList, NULL);
  mupnp_ssdpresponse_serverlist_setuserdata(ssdpResServerList, NULL);
	mupnp_ssdpresponse_serverlist_stop(ssdpResServerList);
	mupnp_log_debug_s("Done\n");
	mupnp_ssdpresponse_serverlist_close(ssdpResServerList);
	mupnp_ssdpresponse_serverlist_clear(ssdpResServerList);
	
	/**** HTTP Server ****/
	httpServerList = mupnp_controlpoint_gethttpserverlist(ctrlPoint);
	mupnp_log_debug_s("Stopping http servers.\n");
  mupnp_http_serverlist_setlistener(httpServerList, NULL);
	mupnp_http_serverlist_stop(httpServerList);
	mupnp_log_debug_s("Done\n");
	mupnp_http_serverlist_close(httpServerList);
	mupnp_http_serverlist_clear(httpServerList);

	mupnp_controlpoint_lock(ctrlPoint);

	mupnp_log_debug_s("Got controlpoint lock.\n");
	
	/* Unsubscribe from all services */

	for (dev = mupnp_controlpoint_getdevices(ctrlPoint); 
	     dev != NULL;
	     dev = mupnp_device_next(dev))
	{
		udn = mupnp_device_getudn(dev);
		
		/* Call device listener for each device */
		if (udn != NULL && listener != NULL)
		{
			mupnp_controlpoint_unlock(ctrlPoint);
			listener(ctrlPoint, udn, mUpnpDeviceStatusRemoved);
			mupnp_controlpoint_lock(ctrlPoint);
		}
	}
	/* Empty device cache */
	mupnp_devicelist_clear(ctrlPoint->deviceList);
	mupnp_log_debug_s("Device list cleared.\n");

	mupnp_controlpoint_unlock(ctrlPoint);
		
	mupnp_log_debug_l4("Leaving...\n");

	return true;
}