public void serviceChanged()

in upnp/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/MyCtrlPoint.java [451:673]


	public void serviceChanged(ServiceEvent event) {
        Activator.logger.DEBUG("[Importer] serviceChanged");
        Activator.logger.DEBUG("Event::"+event.toString());

		if (event.getType() == ServiceEvent.REGISTERED) {
			/* check new listener registration */
			ServiceReference serRef = event.getServiceReference();
			Object obj = serRef.getProperty(UPnPEventListener.UPNP_FILTER);
			/* obtain interested devices for the listener */
			ServiceReference[] devicesRefs = null;
			if (obj != null) {
				Filter filter = (Filter) obj;
				String filtra = filter.toString();
				/*
				 * Avoid to implement the notification for device 
				 * that are not been created by BaseDriver
				 */ 
				String newfilter = "(&" + filtra +  IMPORT_FLTR + ")";
                //String newfilter = "(&" + filtra + "(!" + EXPORT_FLTR + ")" + ")";
				//System.out.println(newfilter);
				try {
					devicesRefs = context.getServiceReferences(UPnPDevice.class
							.getName(), newfilter);
				} catch (InvalidSyntaxException e) {
					e.printStackTrace();
				}

				if (devicesRefs != null) {/*
										   * 
										   * only if there is a compatibile device
										   */
					Dictionary dic = new Hashtable();
					for (int i = 0; i < devicesRefs.length; i++) {
						UPnPDevice device = (UPnPDevice) context.getService(devicesRefs[i]);
						dic.put(UPnPDevice.ID, device.getDescriptions(null).get(UPnPDevice.UDN));
						dic.put(UPnPDevice.TYPE, device.getDescriptions(null).get(UPnPDevice.TYPE));
						UPnPService[] services = device.getServices();
						if (services != null) {
							for (int j = 0; j < services.length; j++) {
								dic.put(UPnPService.ID, services[j].getId());
								dic.put(UPnPService.TYPE, services[j].getType());
								//TODO add method boolean serviceEvented() so we can remove the below cycle
								UPnPStateVariable[] stateVars = services[j].getStateVariables();
								boolean hasEventedVars = false;
								for (int k = 0; k < stateVars.length && ! hasEventedVars; k++) {
									hasEventedVars = stateVars[k].sendsEvents();
									if (hasEventedVars) {
										if(filter.match(dic)){
											UPnPEventListener listener = 
		                                        (UPnPEventListener) context.getService(serRef);
											FirstMessage msg = new FirstMessage(
													((UPnPServiceImpl) services[j]).getCyberService(),
													listener);
											subQueue.enqueue(msg);											
										}
									}
								}
							}
						}
                        context.ungetService(devicesRefs[i]);
					}
				}
			} else {/* obj==null (interested in all devices) */
				try {
					String newfilter = "(!" + EXPORT_FLTR+ ")";
					devicesRefs = context.getServiceReferences(UPnPDevice.class.getName(), newfilter);
				} catch (InvalidSyntaxException e) {
					e.printStackTrace();
				}
				if (devicesRefs != null) {/*
										   * 
										   * only if there is a device
										   */

					for (int i = 0; i < devicesRefs.length; i++) {
						UPnPDevice device = (UPnPDevice) context
								.getService(devicesRefs[i]);
						UPnPService[] services = device.getServices();
						if (services != null) {
							for (int j = 0; j < services.length; j++) {
								UPnPStateVariable[] stateVars = services[j]
										.getStateVariables();
								boolean bool = false;								
								for (int k = 0; k < stateVars.length; k++) {
									bool = stateVars[k].sendsEvents();
									if (bool) {
										break;
									}
								}
								if (bool) {
									UPnPEventListener listener = 
                                        (UPnPEventListener) context.getService(serRef);
									FirstMessage msg = new FirstMessage(
											((UPnPServiceImpl) services[j]).getCyberService(),
											listener);
									subQueue.enqueue(msg);
								}
							}
						}
                        context.ungetService(devicesRefs[i]);
					}
				}
			}

		} else if (event.getType() == ServiceEvent.MODIFIED) {
			Vector newServices = new Vector();
			ServiceReference serRef = event.getServiceReference();
			Filter filter = (Filter) serRef.getProperty(UPnPEventListener.UPNP_FILTER);
			UPnPEventListener listener = (UPnPEventListener) context.getService(serRef);
			ServiceReference[] devicesRefs = null;

			if (filter != null) {
				try {
					String filtra = filter.toString();
                    String newfilter = "(&" + filtra + "(!" + EXPORT_FLTR + ")" + ")";
					devicesRefs = context.getServiceReferences(UPnPDevice.class.getName(), newfilter);
				} catch (InvalidSyntaxException e) {
					e.printStackTrace();
				}
				if (devicesRefs != null) {/*
										   * 
										   * only if there is a compatibile device
										   */
					Dictionary dic = new Hashtable();
					/* 
					 * look for the service that match
					 */
					for (int i = 0; i < devicesRefs.length; i++) {
						UPnPDevice device = (UPnPDevice) context
								.getService(devicesRefs[i]);
						dic.put(UPnPDevice.ID, device.getDescriptions(null)
								.get(UPnPDevice.UDN));
						dic.put(UPnPDevice.TYPE, device.getDescriptions(null)
								.get(UPnPDevice.TYPE));
						UPnPService[] services = device.getServices();

						if (services != null) {
							for (int j = 0; j < services.length; j++) {
								dic.put(UPnPService.ID, services[j].getId());
								dic.put(UPnPService.TYPE, services[j].getType());

								UPnPStateVariable[] stateVars = services[j]
										.getStateVariables();
								boolean hasEventedVars = false;
								for (int k = 0; k < stateVars.length; k++) {
									hasEventedVars = stateVars[k].sendsEvents();
									if (hasEventedVars) {
										break;
									}
								}
								if (!hasEventedVars) {
									continue;
								}

								boolean bool = filter.match(dic);
								if (bool) {
									newServices
											.add(((UPnPServiceImpl) services[j])
													.getCyberService());
								}
							}//for services
						}//services ==null
						context.ungetService(devicesRefs[i]);
					}//for devicesRefs
					ListenerModified msg = new ListenerModified(newServices,
							listener);
					subQueue.enqueue(msg);
				}//devicesrefs !=null
			} else {//interrested in all devices
				try {

					String newfilter = "(!(" + UPnPDevice.UPNP_EXPORT + "=*"
							+ ")" + ")";
					devicesRefs = context.getServiceReferences(UPnPDevice.class
							.getName(), newfilter);
				} catch (InvalidSyntaxException e) {
					e.printStackTrace();
				}
				if (devicesRefs != null) {/*
										   * only if there is a device
										   */

					for (int i = 0; i < devicesRefs.length; i++) {
						UPnPDevice device = (UPnPDevice) context
								.getService(devicesRefs[i]);
						UPnPService[] services = device.getServices();
						if (services != null) {
							for (int j = 0; j < services.length; j++) {
								UPnPStateVariable[] stateVars = services[j]
										.getStateVariables();
								boolean hasEventedVars = false;
								for (int k = 0; k < stateVars.length; k++) {
									hasEventedVars = stateVars[k].sendsEvents();
									if (hasEventedVars) {
										break;
									}
								}
								if (hasEventedVars) {
									newServices
											.add(((UPnPServiceImpl) services[j])
													.getCyberService());
								}//hasEventedvars
							}//for services
						}//services !=null
                        context.ungetService(devicesRefs[i]);
					}//for devicesRefs
					subQueue
							.enqueue(new ListenerModified(newServices, listener));
				}//devicesRefs !=null

			}

		} else if (event.getType() == ServiceEvent.UNREGISTERING) {
			UPnPEventListener listener = (UPnPEventListener) context
					.getService(event.getServiceReference());
			if (listener != null) {
				ListenerUnRegistration msg = new ListenerUnRegistration(
						listener);
				subQueue.enqueue(msg);
			}
			context.ungetService(event.getServiceReference());
		}
	} /*