예제 #1
0
파일: controlpoint.c 프로젝트: Coramo/mupnp
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");
}
예제 #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 SSDPNotifyListner(mUpnpSSDPPacket *ssdpPkt)
{
	if (mupnp_ssdp_packet_isdiscover(ssdpPkt) == true) {
		printf("ssdp:discover : ST = %s\n",
			mupnp_ssdp_packet_getst(ssdpPkt)); 
	}
	else if (mupnp_ssdp_packet_isalive(ssdpPkt) == true) {
		printf("ssdp:alive : uuid = %s, NT = %s, location = %s\n",
			mupnp_ssdp_packet_getusn(ssdpPkt), 
			mupnp_ssdp_packet_getnt(ssdpPkt), 
			mupnp_ssdp_packet_getlocation(ssdpPkt)); 
	}
	else if (mupnp_ssdp_packet_isbyebye(ssdpPkt) == true) {
		printf("ssdp:byebye : uuid = %s, NT = %s\n",
			mupnp_ssdp_packet_getusn(ssdpPkt), 
			mupnp_ssdp_packet_getnt(ssdpPkt));
	}
	mupnp_ssdp_packet_print(ssdpPkt); 
}
예제 #4
0
bool mupnp_ssdp_packet_isrootdevice(mUpnpSSDPPacket *ssdpPkt)
{
	mupnp_log_debug_l4("Entering...\n");

	if (mupnp_nt_isrootdevice(mupnp_ssdp_packet_getnt(ssdpPkt)) == true)
		return true;
	if (mupnp_st_isrootdevice(mupnp_ssdp_packet_getst(ssdpPkt)) == true)
		return true;
	return mupnp_usn_isrootdevice(mupnp_ssdp_packet_getusn(ssdpPkt));

	mupnp_log_debug_l4("Leaving...\n");
}