示例#1
0
void round_finder_upnpdevicelistener(mUpnpControlPoint* cp, const char* udn, mUpnpDeviceStatus devStatus)
{
  RoundFinder* finder = mupnp_controlpoint_getuserdata(cp);
  if (!finder)
    return;

  mUpnpDevice* dev = mupnp_controlpoint_getdevicebyudn(cp, (char*)udn);
  if (!dev)
    return;

  if (!mupnp_device_isdevicetype(dev, ROUND_UPNP_DEVICE_TYPE))
    return;

  RoundNode* node = round_node_new();
  round_node_setaddress(node, mupnp_device_getaddress(dev));
  round_node_setport(node, mupnp_device_gethttpport(dev));

  switch (devStatus) {
  case mUpnpDeviceStatusAdded:
  case mUpnpDeviceStatusUpdated: {
    if (finder->addedListener) {
      finder->addedListener(finder, node);
    }
  } break;
  case mUpnpDeviceStatusRemoved: {
    if (finder->removedListener) {
      finder->removedListener(finder, node);
    }
  } break;
  default:
    break;
  }

  round_node_delete(node);
}
示例#2
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");
}
示例#3
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");
}