You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by fu...@apache.org on 2008/09/23 18:50:24 UTC

svn commit: r698237 - in /felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver: export/ importer/core/ importer/core/event/message/ importer/core/event/structs/ importer/core/event/thread/ importer/core/upnp/

Author: furfari
Date: Tue Sep 23 09:50:24 2008
New Revision: 698237

URL: http://svn.apache.org/viewvc?rev=698237&view=rev
Log:
Added warning message to ThreadExporter when devices are not exported.
First revision of UPnP interface implementation provided by the basedriver importer 
Changed serviceFromSid() implementation in MyCtrlPoint;Now we don't rely now on the Cyberdomo internal list to associate the subscription ID (sid) to a services.
Added Thread.yield() to Notifier and SubScriber to avoid starvation.
Added critical section in Subscriber to synchronize  sidServices structure.
 

Modified:
    felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/export/ThreadExporter.java
    felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/MyCtrlPoint.java
    felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/message/FirstMessage.java
    felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/message/StateChanged.java
    felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/structs/Monitor.java
    felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/thread/Notifier.java
    felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/thread/SubScriber.java
    felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPDeviceImpl.java
    felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPServiceImpl.java
    felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPStateVariableImpl.java

Modified: felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/export/ThreadExporter.java
URL: http://svn.apache.org/viewvc/felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/export/ThreadExporter.java?rev=698237&r1=698236&r2=698237&view=diff
==============================================================================
--- felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/export/ThreadExporter.java (original)
+++ felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/export/ThreadExporter.java Tue Sep 23 09:50:24 2008
@@ -146,16 +146,19 @@
 				Device d = BuildDevice.createCyberLinkDevice(dn.getReference());
 				if (d != null) {
 					if(!bindInvokes(d,rootDevice)){
-						Activator.logger.DEBUG("Unable to find all the sub device or to set action listener");
+						Activator.logger.WARNING("Unable to to set action listener for the exported device: "  + d.getUDN());
 						continue;
 					}
 					ServiceRegistration listenReg = bindSubscribe(d);
 					if(listenReg==null){
-						Activator.logger.DEBUG("Unable to set action listener event listener");
+						Activator.logger.WARNING("Unable to set event listener for the exported device: " + d.getUDN());
 						continue;
 					}			
 					//makeIcons(r.getRootDevice(),xml.getAbsolutePath());
-					d.start();
+					if (d.start() == false){
+						Activator.logger.WARNING("Unable to allocate resources for the exported device: " + d.getUDN());
+						continue;					
+					}
 					exportedDevices.put(
 							rootDevice.getProperty(UPnPDevice.UDN),
 							new ExportedDeviceInfo(d,listenReg,dn)

Modified: felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/MyCtrlPoint.java
URL: http://svn.apache.org/viewvc/felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/MyCtrlPoint.java?rev=698237&r1=698236&r2=698237&view=diff
==============================================================================
--- felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/MyCtrlPoint.java (original)
+++ felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/MyCtrlPoint.java Tue Sep 23 09:50:24 2008
@@ -79,8 +79,6 @@
         "(" + UPnPDevice.UPNP_EXPORT + "=*" + ")";
     private final String IMPORT_FLTR =
         "(" + org.apache.felix.upnp.basedriver.util.Constants.UPNP_IMPORT + "=*" + ")";
-//	private Hashtable waitingEvents;
-//	private Hashtable sidServices;
 
     
     public MyCtrlPoint(BundleContext context, SubscriptionQueue subQueue,
@@ -90,8 +88,6 @@
 		
         devices = new Hashtable();
         addDeviceChangeListener(this);
-//      waitingEvents = new Hashtable();
-//      sidServices = new Hashtable();
 		try {
 			context.addServiceListener(this, UPNP_EVENT_LISTENER_FLTR);
 		} catch (InvalidSyntaxException e) {
@@ -111,7 +107,6 @@
 	public void deviceAdded(Device cyberDevice) {
 		String udn = cyberDevice.getUDN();
 		String friendlyName = cyberDevice.getFriendlyName();
-		
 		if (isExportedDevice(udn)) {
             Activator.logger.INFO("[Importer] discoverded Exported Device :"+friendlyName+"("+udn+")" );
 		}
@@ -256,7 +251,7 @@
 								String serviceId = (String) filters[j].get(UPnPService.ID);
 								UPnPServiceImpl service = (UPnPServiceImpl) device.getService(serviceId);
 								FirstMessage msg = new FirstMessage(
-										service.getCyberService(),
+										service,
 										upnpEventListenerService);
 								subQueue.enqueue(msg);											
 							}							
@@ -274,7 +269,7 @@
 
 						for (int j = 0; j < eventedServices.length; j++) {
 							FirstMessage msg = new FirstMessage(
-									eventedServices[j].getCyberService(),
+									eventedServices[j],
 									upnpEventListenerService);
 							subQueue.enqueue(msg);
 						}
@@ -298,7 +293,7 @@
 							if (filter.match(filters[j])) {
 								String serviceId = (String) filters[j].get(UPnPService.ID);
 								UPnPServiceImpl service = (UPnPServiceImpl) device.getService(serviceId);
-								newServices.add(service.getCyberService());
+								newServices.add(service);
 							}							
 						}
 						context.ungetService(devicesRefs[i]);
@@ -359,9 +354,7 @@
 		
 	}
 	
-    public void searchForListener(UPnPDeviceImpl device) {
-    	System.out.println("searching for UPnPEvent Listners already registered");
-    	
+    public void searchForListener(UPnPDeviceImpl device) {    	
     	Activator.logger.DEBUG("[Importer] searching for UPnPEventListener");
     	ServiceReference[] listeners = null;
     	try {
@@ -378,7 +371,7 @@
     				UPnPServiceImpl[] eventedServices = device.getEventedServices();
     				for (int j = 0; j < eventedServices.length; j++) {
     					FirstMessage msg = new FirstMessage(
-    							eventedServices[j].getCyberService(),
+    							eventedServices[j],
     							listener);
     					subQueue.enqueue(msg);
     				}
@@ -388,7 +381,7 @@
     					if( filter.match(filters[j])){
     						String serviceId = (String) filters[j].get(UPnPService.ID);
     						UPnPServiceImpl service = (UPnPServiceImpl) device.getService(serviceId);							
-    						subQueue.enqueue(new FirstMessage(service.getCyberService(), listener));
+    						subQueue.enqueue(new FirstMessage(service, listener));
     					}
     				}
     			}
@@ -411,7 +404,7 @@
 	 * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
 	 */
 	
-	synchronized public void httpRequestRecieved(HTTPRequest httpReq) {
+	public void httpRequestRecieved(HTTPRequest httpReq) {
         Activator.logger.DEBUG("[Importer] httpRequestRecieved event");
         Activator.logger.PACKET(httpReq.toString());
 
@@ -433,13 +426,9 @@
         Activator.logger.DEBUG("[Importer] newEventArrived");
 		String uuid = notifyReq.getSID();
 
-		Service service = serviceFromSid(uuid);
-		//System.out.println("new event arrived" + " seq: " +seq + " uuis: " +uuid );
+		UPnPServiceImpl service = serviceFromSid(uuid);
 		if (service == null) {
 			System.out.println(" but SERVICE IS NULL !!!!!!!!!!! sid: " +uuid);
-//			synchronized (waitingEvents) {
-//				waitingEvents.put(uuid, notifyReq);				
-//			}
 		}
 		else if (service != null) {
 			long seq = notifyReq.getSEQ();
@@ -450,7 +439,7 @@
                 Property prop = props.getProperty(i);
                 String varName = prop.getName();
                 String varValue = prop.getValue();
-                String upnpType = service.getStateVariable(varName).getDataType();
+                String upnpType = service.getStateVariable(varName).getUPnPDataType();
                 Object valueObj;
                 try {
                     valueObj = Converter.parseString(varValue,upnpType);
@@ -462,98 +451,70 @@
                 hash.put(varName, valueObj);
             }
            
-			Device device = service.getDevice();
-			StateChanged msg = new StateChanged(uuid, seq, hash, device, service);
-			//System.out.println("notifierQueue.enqueue(msg);");
+			String deviceId = service.getDeviceId();
+			String serviceId = service.getId();
+			StateChanged msg = new StateChanged(uuid, seq, hash, deviceId, serviceId);
 			notifierQueue.enqueue(msg);
 		}
 	}
     
 
-	public Service serviceFromSid(String sid) {
-		
-//		synchronized (sidServices) {
-//			return (Service) sidServices.get(sid);
-//		}
-		
-		
-		synchronized (devices) {
-			
-		Enumeration e = devices.elements();
-		//System.out.println("#### DEVICES SIZE" +devices.size());
-		Service cyberService = null;
-		while (e.hasMoreElements()) {
-			OSGiDeviceInfo deviceinfo = (OSGiDeviceInfo) e.nextElement();
-			UPnPDevice device = deviceinfo.getOSGiDevice();
-			UPnPService[] services = (UPnPService[]) device.getServices();
-			UPnPServiceImpl[] servicesImpl = new UPnPServiceImpl[services.length];
-			for (int i = 0; i < servicesImpl.length; i++) {
-				servicesImpl[i] = (UPnPServiceImpl) services[i];
-			}
-			for (int i = 0; i < servicesImpl.length; i++) {
-				cyberService = servicesImpl[i].getCyberService();
-				boolean bool = cyberService.isSubscribed();
-				if (bool) {
-					if (cyberService.getSID().equals(sid)) {
-						return cyberService;
-					}
-				}
-			}
-			//System.out.println("Device NOT MATCHED " +device.getDescriptions(null).get(UPnPDevice.ID));
-		}
+	public UPnPServiceImpl serviceFromSid(String sid) {
+
+		synchronized (sidServices) {
+			return (UPnPServiceImpl) sidServices.get(sid);
 		}
 		
-		return null;
-	}
-	  
-    
-
-     
-
-//	public Hashtable getWaitingEvents() {
-//		return waitingEvents;
-//		
-//	}
-	
-	synchronized public boolean subscribe(Service service, long timeout)
-	{
-		return super.subscribe(service,timeout);
-		
-//		if (service.isSubscribed() == true) {
-//			System.out.println( "isSubsribed "+ service.getServiceID() + " " +service.getDevice().getUDN());
-//			String sid = service.getSID();
-//			return subscribe(service, sid, timeout);
-//		}
-//		
-//		Device rootDev = service.getRootDevice();
-//		if (rootDev == null)
-//			return false;
-//		String ifAddress = rootDev.getInterfaceAddress();		 
-//		SubscriptionRequest subReq = new SubscriptionRequest();
-//		subReq.setSubscribeRequest(service, getEventSubCallbackURL(ifAddress), timeout);
-//		SubscriptionResponse subRes = subReq.post();
-//		if (subRes.isSuccessful() == true) {
-//			//System.out.println( "subscription response "+ service.getServiceID() + " " +service.getDevice().getUDN());
-//			String sid = subRes.getSID();
-
-//			synchronized (sidServices) {
-//				sidServices.put(sid,service);				
+		
+//		synchronized (devices) {
+//
+//			Enumeration e = devices.elements();
+//			//System.out.println("#### DEVICES SIZE" +devices.size());
+//			Service cyberService = null;
+//			while (e.hasMoreElements()) {
+//				OSGiDeviceInfo deviceinfo = (OSGiDeviceInfo) e.nextElement();
+//				UPnPDevice device = deviceinfo.getOSGiDevice();
+//				UPnPService[] services = (UPnPService[]) device.getServices();
+//				UPnPServiceImpl[] servicesImpl = new UPnPServiceImpl[services.length];
+//				for (int i = 0; i < servicesImpl.length; i++) {
+//					servicesImpl[i] = (UPnPServiceImpl) services[i];
+//				}
+//				for (int i = 0; i < servicesImpl.length; i++) {
+//					cyberService = servicesImpl[i].getCyberService();
+//					boolean bool = cyberService.isSubscribed();
+//					if (bool) {
+//						if (cyberService.getSID().equals(sid)) {
+//							return cyberService;
+//						}
+//					}
+//				}
+//				//System.out.println("Device NOT MATCHED " +device.getDescriptions(null).get(UPnPDevice.ID));
 //			}
-
-//			service.setSID(sid);
-//			service.setTimeout(subRes.getTimeout());
-//			return true;
-//			
 //		}
-//		service.clearSID();
-//		return false;
+//		
+//		return null;
 	}
+	  
+   	
+
 	/*
 	 * (non-Javadoc)
 	 * 
 	 * @see org.cybergarage.upnp.ControlPoint#removeExpiredDevices()
 	 *  
 	 */
+
+	public Hashtable sidServices = new Hashtable();
+	public void saveSid(String sid, UPnPServiceImpl service) {
+		synchronized (sidServices) {
+			sidServices.put(sid, service);
+		}		
+	}
+	public void clearSid(String sid) {
+		synchronized (sidServices) {
+			sidServices.remove(sid);
+		}		
+	}
 	
 	
 

Modified: felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/message/FirstMessage.java
URL: http://svn.apache.org/viewvc/felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/message/FirstMessage.java?rev=698237&r1=698236&r2=698237&view=diff
==============================================================================
--- felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/message/FirstMessage.java (original)
+++ felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/message/FirstMessage.java Tue Sep 23 09:50:24 2008
@@ -21,6 +21,8 @@
 
 import org.osgi.service.upnp.UPnPEventListener;
 
+import org.apache.felix.upnp.basedriver.importer.core.upnp.UPnPServiceImpl;
+
 import org.cybergarage.upnp.Device;
 import org.cybergarage.upnp.Service;
 
@@ -34,18 +36,19 @@
  
 
 public class FirstMessage {
-	private Service service;
+	
+
+	private UPnPServiceImpl service;
 	private UPnPEventListener listener;
 	private String sid;
-	private Device device;
-
-	public FirstMessage(Service service, UPnPEventListener listener) {
+	
+	public FirstMessage(UPnPServiceImpl service, UPnPEventListener listener) {
 		this.service = service;
 		this.listener = listener;
 		this.sid = "";
-		this.device = service.getDevice();
 	}
-	public Service getService() {
+	
+	public UPnPServiceImpl getService() {
 		return service;
 	}
 	public UPnPEventListener getListener() {

Modified: felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/message/StateChanged.java
URL: http://svn.apache.org/viewvc/felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/message/StateChanged.java?rev=698237&r1=698236&r2=698237&view=diff
==============================================================================
--- felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/message/StateChanged.java (original)
+++ felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/message/StateChanged.java Tue Sep 23 09:50:24 2008
@@ -31,27 +31,22 @@
 	private String sid;
 	private Dictionary dic;
 	private long seq;
-	private Service service;
-	private Device device;
+	private String serviceId;
+	private String deviceId;
 	/**
 	 * @param sid
 	 * @param dic
 	 * @param varName
 	 * @param varValue
 	 */
-	public StateChanged(String sid, long seq, Dictionary dic, Device device,
-			Service service) {
-		super();
+	public StateChanged(String sid, long seq, Dictionary dic, String deviceId,
+			String serviceId) {
+
 		this.sid = sid;
-		/*
-		 * this.varName = varName; this.varValue = varValue;
-		 */
 		this.dic = dic;
-		/* dic.put(this.varName, this.varValue); */
-		//this.service=service;
 		this.seq = seq;
-		this.device = device;
-		this.service = service;
+		this.deviceId = deviceId;
+		this.serviceId = serviceId;
 	}
 
 	public Dictionary getDictionary() {
@@ -72,9 +67,9 @@
 	 *  
 	 */
 	public String getDeviceID() {
-		return device.getUDN();
+		return deviceId;
 	}
 	public String getServiceID() {
-		return service.getServiceID();
+		return serviceId;
 	}
 }

Modified: felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/structs/Monitor.java
URL: http://svn.apache.org/viewvc/felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/structs/Monitor.java?rev=698237&r1=698236&r2=698237&view=diff
==============================================================================
--- felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/structs/Monitor.java (original)
+++ felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/structs/Monitor.java Tue Sep 23 09:50:24 2008
@@ -32,6 +32,7 @@
 import org.apache.felix.upnp.basedriver.importer.core.MyCtrlPoint;
 import org.apache.felix.upnp.basedriver.importer.core.event.message.FirstMessage;
 import org.apache.felix.upnp.basedriver.importer.core.event.message.ListenerModified;
+import org.apache.felix.upnp.basedriver.importer.core.upnp.UPnPServiceImpl;
 
 /* 
 * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
@@ -125,10 +126,7 @@
                     sidListSid.getListenersFromSid(sid);
 				listeners.remove(listener);
 				if (listeners.size() == 0) {
-					Service service = 
-                        ctrl.serviceFromSid(sid);
-					//##renew  Renewer renewer = sidRenewer.get((String) sids.elementAt(i));
-					//##renew  renewer.stop();
+					Service service =  ctrl.serviceFromSid(sid).getCyberService();
 					if (service != null) {
 						boolean ok = ctrl.unsubscribe(service);
 						if (!ok) {
@@ -153,16 +151,17 @@
 		Vector notSubscribed = new Vector();
 		
 		for (int i = 0; i < newServices.size(); i++) {
-			Service ser = (Service) newServices.elementAt(i);
-			if (ser.isSubscribed()) {
-				subscribed.add(ser);
+			UPnPServiceImpl osgiService = (UPnPServiceImpl) newServices.get(i);
+			Service cyberService = osgiService.getCyberService();
+			if (cyberService.isSubscribed()) {
+				subscribed.add(osgiService);
 			} else {
-				notSubscribed.add(ser);
+				notSubscribed.add(osgiService);
 			}
 		}
 		
 		for (int i = 0; i < notSubscribed.size(); i++) {
-			Service ser = (Service) notSubscribed.elementAt(i);
+			UPnPServiceImpl ser = (UPnPServiceImpl) notSubscribed.get(i);
 			subqueue.enqueue(new FirstMessage(ser, listener));
 		}
 
@@ -195,7 +194,7 @@
         Vector listeners = sidListSid.getListenersFromSid(sid);
         listeners.remove(listener);
         if(listeners.size()==0){
-			Service service = ctrl.serviceFromSid(sid);
+			Service service = ctrl.serviceFromSid(sid).getCyberService();
 			if (service != null) {
 				boolean ok = ctrl.unsubscribe(service);
 				if (!ok) {

Modified: felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/thread/Notifier.java
URL: http://svn.apache.org/viewvc/felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/thread/Notifier.java?rev=698237&r1=698236&r2=698237&view=diff
==============================================================================
--- felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/thread/Notifier.java (original)
+++ felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/thread/Notifier.java Tue Sep 23 09:50:24 2008
@@ -53,6 +53,7 @@
 				} else {
 					monitor.updateStateVars(msg.getSid(),msg.getDictionary());
 				}
+				Thread.yield();
             }
 		}
 	}

Modified: felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/thread/SubScriber.java
URL: http://svn.apache.org/viewvc/felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/thread/SubScriber.java?rev=698237&r1=698236&r2=698237&view=diff
==============================================================================
--- felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/thread/SubScriber.java (original)
+++ felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/event/thread/SubScriber.java Tue Sep 23 09:50:24 2008
@@ -29,6 +29,7 @@
 import org.cybergarage.upnp.event.NotifyRequest;
 import org.cybergarage.upnp.event.Property;
 import org.cybergarage.upnp.event.PropertyList;
+import org.cybergarage.upnp.event.Subscription;
 
 import org.apache.felix.upnp.basedriver.Activator;
 import org.apache.felix.upnp.basedriver.importer.core.MyCtrlPoint;
@@ -64,35 +65,34 @@
 			Object msg = subQueue.dequeue();
 			if (running) {
 				if (msg instanceof FirstMessage) {
-					//System.out.println("msg instanceof FirstMessage");
-
 					FirstMessage firstmsg = (FirstMessage) msg;
-					Service service = firstmsg.getService();
+					Service service = firstmsg.getService().getCyberService();
 					if (!service.isSubscribed()) {//is not subscribe
-						boolean ok = ctrl.subscribe(service,120000);
-						String sid = "";
-						if (ok) {//subcribe ok	                        
-							sid = service.getSID();
-							firstmsg.setSid(sid);                        
-							monitor.addListener(sid,firstmsg.getListener());
-//							wakeupEventsForSid(sid);
-						} else {//subscribe not ok
-							Activator.logger.log(LogService.LOG_ERROR,"Sucribe failed");
-							//System.out.println(" subscribe failed");
+
+						synchronized (ctrl.sidServices) {
+							boolean ok = ctrl.subscribe(service,Subscription.INFINITE_VALUE);
+							String sid = "";
+							if (ok) {//subcribe ok	                        
+								sid = service.getSID();
+								firstmsg.setSid(sid);                        
+								monitor.addListener(sid,firstmsg.getListener());
+								ctrl.saveSid(sid,firstmsg.getService());
+							} else {//subscribe not ok
+								Activator.logger.log(LogService.LOG_ERROR,"Sucribe failed");
+								System.out.println(" subscribe failed");
+							}					
 						}
 					} else {// already subscribe
 						monitor.addListener(service.getSID(),firstmsg.getListener());
-//						wakeupEventsForSid(service.getSID());
-						//System.out.println("already subscribed");
 					}
 				} else if (msg instanceof ListenerModified) {
-					//System.out.println("msg instanceof ListenerModified");
 					monitor.updateListener((ListenerModified)msg,subQueue,ctrl);
 				} else if (msg instanceof ListenerUnRegistration) {
-					//System.out.println("msg instanceof ListenerUnRegistration");
 					ListenerUnRegistration unreg=(ListenerUnRegistration)msg;
 					monitor.delListener(unreg.getListener(),ctrl);
+					//TODO invoke ctrl.clearSID()
 				}
+				Thread.yield();				
 			}
 		}
 	}

Modified: felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPDeviceImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPDeviceImpl.java?rev=698237&r1=698236&r2=698237&view=diff
==============================================================================
--- felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPDeviceImpl.java (original)
+++ felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPDeviceImpl.java Tue Sep 23 09:50:24 2008
@@ -215,7 +215,7 @@
 		}
 		
 		/* 
-		 * service of this device
+		 * services of this device
 		 */ 
 		ServiceList serviceList = dev.getServiceList();
 		int size = serviceList.size();
@@ -225,7 +225,7 @@
 		ArrayList eventedServiceList = new ArrayList();
 		for (int i = 0; i < size; i++) {
 			Service service = serviceList.getService(i);
-			UPnPServiceImpl serviceImpl = new UPnPServiceImpl(service);
+			UPnPServiceImpl serviceImpl = new UPnPServiceImpl(service,udn);
 			services.put(service.getServiceID(), serviceImpl);
 			servicesArray[i] = serviceImpl;
 			if (serviceImpl.hasEventedStateVariables()) eventedServiceList.add(serviceImpl);
@@ -233,16 +233,8 @@
 			seriviceTypeSet.add(serviceImpl.getType());
 		}
 		
-		//TODO check null for eventedservices
 		String[] servicesTypeProperty = (String[]) seriviceTypeSet.toArray(new String[]{});
 		eventedServices = (UPnPServiceImpl[]) eventedServiceList.toArray(new UPnPServiceImpl[]{});
-//		String[] servicesTypeProperty = new String[serTypeSet.size()];
-//		Iterator iter = serTypeSet.iterator();
-//		int i = 0;
-//		while (iter.hasNext()) {
-//			servicesTypeProperty[i] = (String) iter.next();
-//			i++;
-//		}
 		properties.put(UPnPService.ID, servicesIDProperty);
 		properties.put(UPnPService.TYPE, servicesTypeProperty);
 

Modified: felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPServiceImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPServiceImpl.java?rev=698237&r1=698236&r2=698237&view=diff
==============================================================================
--- felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPServiceImpl.java (original)
+++ felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPServiceImpl.java Tue Sep 23 09:50:24 2008
@@ -44,9 +44,15 @@
 	private UPnPActionImpl[] actionsArray;
 	private UPnPStateVariableImpl[] stateVariablesArray;
 	private boolean hasEventedStateVariables;
+	private String deviceId;
+	private String serviceId;
+	private String serviceType;
 	
-	public UPnPServiceImpl(Service service) {
+	public UPnPServiceImpl(Service service, String udn) {
 		this.service = service;
+		this.deviceId = udn;
+		this.serviceId = service.getServiceID();
+		this.serviceType = service.getServiceType();
 		actions = new Hashtable();
 		stateVariables=new Hashtable();
 		
@@ -78,7 +84,7 @@
 	   * @see org.osgi.service.upnp.UPnPService#getId()
 	   */
 	public String getId() {
-		return service.getServiceID();
+		return serviceId;
 	}
 
 	/*
@@ -87,7 +93,7 @@
 	 * @see org.osgi.service.upnp.UPnPService#getType()
 	 */
 	public String getType() {
-		return service.getServiceType();
+		return serviceType;
 	}
 
 	/*
@@ -144,5 +150,9 @@
 	public boolean hasEventedStateVariables(){
 		return hasEventedStateVariables;
 	}
+	
+	public String getDeviceId(){
+		return deviceId;
+	}
 
 }

Modified: felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPStateVariableImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPStateVariableImpl.java?rev=698237&r1=698236&r2=698237&view=diff
==============================================================================
--- felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPStateVariableImpl.java (original)
+++ felix/sandbox/furfari/Version-1.0.0/basedriver/src/main/java/org/apache/felix/upnp/basedriver/importer/core/upnp/UPnPStateVariableImpl.java Tue Sep 23 09:50:24 2008
@@ -46,7 +46,13 @@
     private String[] values = null;    
     
     private Boolean hasMaxMinStep = null;
-    private Boolean hasRangeValues = null;    
+    private Boolean hasRangeValues = null;
+
+	private String name;
+
+	private String dataType;
+
+	private boolean isSendEvent;    
 
 	private static Hashtable upnp2javaTable = null;
 	
@@ -107,27 +113,30 @@
 	public UPnPStateVariableImpl(StateVariable variable) {
 
 		this.variable = variable;
+		this.name = variable.getName();
+		this.dataType = variable.getDataType();
+		this.isSendEvent = variable.isSendEvents();
 	} 
 
     /**
      * @see org.osgi.service.upnp.UPnPStateVariable#getName()
 	 */
 	public String getName() {
-		return variable.getName();
+		return name;
 	}
 
 	/**
 	 * @see org.osgi.service.upnp.UPnPStateVariable#getJavaDataType()
 	 */
 	public Class getJavaDataType() {
-		return (Class) upnp2javaTable.get(variable.getDataType());
+		return (Class) upnp2javaTable.get(dataType);
 	}
 
 	/**
 	 * @see org.osgi.service.upnp.UPnPStateVariable#getUPnPDataType()
 	 */
 	public String getUPnPDataType() {
-		return variable.getDataType();
+		return dataType;
 	}
 
 	/**
@@ -267,7 +276,7 @@
 	 * @see org.osgi.service.upnp.UPnPStateVariable#sendsEvents()
 	 */
 	public boolean sendsEvents() {
-		return variable.isSendEvents();
+		return isSendEvent;
 	}