Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/AbstractUPnPStateVariable.java
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/AbstractUPnPStateVariable.java?view=auto&rev=533875
==============================================================================
---
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/AbstractUPnPStateVariable.java
(added)
+++
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/AbstractUPnPStateVariable.java
Mon Apr 30 16:15:05 2007
@@ -0,0 +1,112 @@
+package org.apache.felix.upnp.devicegen.util;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.upnp.UPnPService;
+import org.osgi.service.upnp.UPnPStateVariable;
+
+public abstract class AbstractUPnPStateVariable
+ implements UPnPStateVariable, BundleActivator {
+
+ final protected String NAME;
+ final protected String DATA_TYPE;
+ final protected Object DEFAULT_VALUE;
+ final protected String[] ALLOWED_VALUES;
+ final protected Number STEP;
+ final protected Number MIN;
+ final protected Number MAX;
+ final protected boolean SENDEVENT;
+ final protected boolean OPTIONAL;
+
+ final protected UPnPService upnpService;
+
+ public AbstractUPnPStateVariable(
+ UPnPService upnpService,
+ String NAME,
+ String DATA_TYPE,
+ Object DEFAULT_VALUE,
+ String[] ALLOWED_VALUES,
+ Number STEP,
+ Number MIN,
+ Number MAX,
+ boolean SENDEVENT,
+ boolean OPTIONAL
+ ) {
+ this.upnpService = upnpService;
+ this.NAME = NAME;
+ this.DATA_TYPE = DATA_TYPE;
+ this.DEFAULT_VALUE = DEFAULT_VALUE;
+ this.ALLOWED_VALUES = ALLOWED_VALUES;
+ this.STEP = STEP;
+ this.MIN = MIN;
+ this.MAX = MAX;
+ this.SENDEVENT = SENDEVENT;
+ this.OPTIONAL = OPTIONAL;
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPStateVariable#getName()
+ */
+ public String getName() {
+ return NAME;
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPStateVariable#getJavaDataType()
+ */
+ public Class getJavaDataType() {
+ return UPnPDataTypeUtil.getClass(DATA_TYPE);
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPStateVariable#getUPnPDataType()
+ */
+ public String getUPnPDataType() {
+ return DATA_TYPE;
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPStateVariable#getDefaultValue()
+ */
+ public Object getDefaultValue() {
+ return DEFAULT_VALUE;
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPStateVariable#getAllowedValues()
+ */
+ public String[] getAllowedValues() {
+ return ALLOWED_VALUES;
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPStateVariable#getMinimum()
+ */
+ public Number getMinimum() {
+ return MIN;
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPStateVariable#getMaximum()
+ */
+ public Number getMaximum() {
+ return MAX;
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPStateVariable#getStep()
+ */
+ public Number getStep() {
+ return STEP;
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPStateVariable#sendsEvents()
+ */
+ public boolean sendsEvents() {
+ return SENDEVENT;
+ }
+
+ public abstract void start(BundleContext bundleContext) throws
Exception;
+ public abstract void stop(BundleContext bundleContext) throws Exception;
+}
\ No newline at end of file
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/AbstractUPnPStateVariable.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/DeviceIcon.java
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/DeviceIcon.java?view=auto&rev=533875
==============================================================================
---
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/DeviceIcon.java
(added)
+++
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/DeviceIcon.java
Mon Apr 30 16:15:05 2007
@@ -0,0 +1,82 @@
+/*
+__LICENSE__
+*/
+package org.apache.felix.upnp.devicegen.util;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.osgi.service.upnp.UPnPIcon;
+
+public class DeviceIcon implements UPnPIcon {
+
+ private String mimetype;
+ private int width;
+ private int height;
+ private int size;
+ private int depth;
+ private String urlStr;
+ private ClassLoader classLoader;
+
+ public DeviceIcon(
+ String mimetype,
+ int width,
+ int height,
+ int size,
+ int depth,
+ String urlStr,
+ ClassLoader classLoader
+ ){
+ this.mimetype=mimetype;
+ this.width=width;
+ this.height=height;
+ this.size=size;
+ this.depth=depth;
+ this.urlStr=urlStr;
+ this.classLoader=classLoader;
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPIcon#getMimeType()
+ */
+ public String getMimeType() {
+ return "image/png";
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPIcon#getWidth()
+ */
+ public int getWidth() {
+ return 32;
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPIcon#getHeight()
+ */
+ public int getHeight() {
+ return 32;
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPIcon#getSize()
+ */
+ public int getSize() {
+ return 0;
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPIcon#getDepth()
+ */
+ public int getDepth() {
+ return 16;
+ }
+
+ /**
+ * @see org.osgi.service.upnp.UPnPIcon#getInputStream()
+ */
+ public InputStream getInputStream() throws IOException {
+ return classLoader.getResourceAsStream(urlStr);
+ //return
Thread.currentThread().getContextClassLoader().getResourceAsStream(urlStr);
+ //return DeviceIcon.class.getResourceAsStream(urlStr);
+ }
+}
+
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/DeviceIcon.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/EventSource.java
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/EventSource.java?view=auto&rev=533875
==============================================================================
---
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/EventSource.java
(added)
+++
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/EventSource.java
Mon Apr 30 16:15:05 2007
@@ -0,0 +1,36 @@
+/*
+DomoWare OSGi UPnP Sample TV Device is an implementation of UPnP Device
service to be used with OSGi Framework
+Copyright (C) 2004 Matteo Demuru, Francesco Furfari, Stefano "Kismet" Lenzi
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+You can contact us at:
+ {matte-d, sygent, kismet-sl} [at] users.sourceforge.net
+*/
+package org.apache.felix.upnp.devicegen.util;
+
+import java.beans.PropertyChangeListener;
+
+/**
+ * EventSource.java 8-feb-2005
+ * @author Francesco Furfari
+ */
+public interface EventSource {
+ void addPropertyChangeListener(PropertyChangeListener listener);
+ void addPropertyChangeListener(String propertyName,
PropertyChangeListener listener);
+ void removePropertyChangeListener(PropertyChangeListener listener);
+ void removePropertyChangeListener(String propertyName,
PropertyChangeListener listener);
+}
+
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/EventSource.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/Lookup.java
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/Lookup.java?view=auto&rev=533875
==============================================================================
---
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/Lookup.java
(added)
+++
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/Lookup.java
Mon Apr 30 16:15:05 2007
@@ -0,0 +1,118 @@
+/*
+DomoWare UPnP Base Driver is an implementation of the OSGi UnP Device
Specifaction
+Copyright (C) 2005 Matteo Demuru, Francesco Furfari, Stefano "Kismet" Lenzi
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+You can contact us at:
+ {matte-d, sygent, kismet-sl} [at] users.sourceforge.net
+*/
+
+package org.apache.felix.upnp.devicegen.util;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.upnp.UPnPDevice;
+import org.osgi.service.upnp.UPnPService;
+
+/**
+ * Lookup.java 8-feb-2005
+ * @author Francesco Furfari
+ */
+public class Lookup {
+
+ static BundleContext context;
+ private ArrayList references = new ArrayList();
+
+ public UPnPService getService(String deviceId,String serviceId){
+ UPnPDevice device = getDevice(deviceId);
+ if (device == null) return null;
+ return device.getService(serviceId);
+ }
+
+ public UPnPDevice getDevice(String deviceId){
+ ServiceReference sr = getReference(deviceId);
+ if (sr == null) return null;
+ return getDevice(sr);
+ }
+
+ private UPnPDevice getDevice(ServiceReference sr){
+ references.add(sr);
+ return(UPnPDevice) context.getService(sr);
+ }
+
+ public ServiceReference getReference(String deviceId){
+ try {
+ String filter = "(" + UPnPDevice.ID + "="+ deviceId + ")";
+ ServiceReference[] listeners =
context.getServiceReferences(UPnPDevice.class.getName(),filter);
+ if (listeners != null)
+ for (int i = 0;i<listeners.length;i++){
+ return listeners[i]; // the Device Id
should be unique
+ }
+ return null;
+ } catch (Exception ex) {
+ System.out.println(ex);
+ return null;
+ }
+ }
+
+ public String getDeviceType(String deviceId){
+ ServiceReference sr = getReference(deviceId);
+ if (sr == null) return null;
+ return (String) sr.getProperty(UPnPDevice.TYPE);
+ }
+
+ public Object getDeviceProperty(String deviceId,String key){
+ ServiceReference sr = getReference(deviceId);
+ if (sr == null) return null;
+ return sr.getProperty(key);
+ }
+
+ public String getServiceType(String deviceId, String serviceId){
+ UPnPDevice device = getDevice(deviceId);
+ if (device == null) return null;
+ return device.getService(serviceId).getType();
+ }
+
+ public boolean isRootDevice(String deviceId){
+ ServiceReference sr = getReference(deviceId);
+ //if (sr == null) return null;
+ String parent = (String) sr.getProperty(UPnPDevice.PARENT_UDN);
+ if((parent == null)||parent.equals("")) return true;
+ return false;
+ }
+
+ public UPnPDevice getRootDevice(String deviceId) {
+ ServiceReference sr = getReference(deviceId);
+ String parent = (String) sr.getProperty(UPnPDevice.PARENT_UDN);
+ if((parent == null)||parent.equals(""))
+ return getDevice(sr);
+ else
+ return getRootDevice(parent);
+ }
+
+ public void ungetServices(){
+ Iterator list = this.references.iterator();
+ while( list.hasNext()){
+ ServiceReference sr = (ServiceReference) list.next();
+ context.ungetService(sr);
+ list.remove();
+ }
+ }
+
+}
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/Lookup.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPDataTypeUtil.java
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPDataTypeUtil.java?view=auto&rev=533875
==============================================================================
---
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPDataTypeUtil.java
(added)
+++
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPDataTypeUtil.java
Mon Apr 30 16:15:05 2007
@@ -0,0 +1,72 @@
+/*
+ * __LICENSE__
+ */
+package org.apache.felix.upnp.devicegen.util;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.osgi.service.upnp.UPnPStateVariable;
+
+/**
+ * utility class to obtains java class for UPnP data type
+ * @author donsez
+ */
+public class UPnPDataTypeUtil {
+
+ private static Map dataTypeMap;
+ static {
+ dataTypeMap = new HashMap();
+ dataTypeMap.put(UPnPStateVariable.TYPE_UI1, Integer.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_UI2, Integer.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_UI4, Long.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_I1, Integer.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_I2, Integer.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_I4, Integer.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_INT, Integer.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_R4, Float.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_R8, Double.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_NUMBER, Double.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_FIXED_14_4,
Double.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_FLOAT, Float.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_CHAR, Character.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_STRING, String.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_DATE, Date.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_DATETIME, Date.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_DATETIME_TZ, Date.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_TIME, Long.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_TIME_TZ, Long.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_BOOLEAN, Boolean.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_BIN_BASE64,
byte[].class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_BIN_HEX, byte[].class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_URI, String.class);
+ dataTypeMap.put(UPnPStateVariable.TYPE_UUID, String.class);
+ }
+
+ public static Class getClass(String upnpDataType){
+ return (Class)dataTypeMap.get(upnpDataType);
+ }
+
+ public static String getClassName(String upnpDataType)throws
IllegalArgumentException {
+ Class clazz=(Class)dataTypeMap.get(upnpDataType);
+ if(clazz==null) throw new IllegalArgumentException("No class
for "+upnpDataType);
+ return clazz.getName();
+ }
+
+ public static Object instanciateObject(String upnpDataType, String
value){
+ Class clazz=(Class)dataTypeMap.get(upnpDataType);
+ if(clazz.equals(Integer.class)) return new Integer(value);
+ if(clazz.equals(Long.class)) return new Long(value);
+ if(clazz.equals(Float.class)) return new Float(value);
+ if(clazz.equals(Double.class)) return new Double(value);
+ if(clazz.equals(Boolean.class)) return new Boolean(value);
+ if(clazz.equals(String.class)) return new String(value);
+ if(clazz.equals(Character.class)) return new
Character(value.charAt(0));
+
+ // TODO TYPE_DATE,TYPE_BIN_BASE64, TYPE_BIN_HEX
+ if(clazz==null) throw new IllegalArgumentException("Can not
instanciate object for "+upnpDataType);
+ return null;
+ }
+
+}
\ No newline at end of file
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPDataTypeUtil.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPEventListenerUtil.java
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPEventListenerUtil.java?view=auto&rev=533875
==============================================================================
---
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPEventListenerUtil.java
(added)
+++
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPEventListenerUtil.java
Mon Apr 30 16:15:05 2007
@@ -0,0 +1,66 @@
+/*
+ * __LICENSE__
+ */
+package org.apache.felix.upnp.devicegen.util;
+
+import java.io.PrintStream;
+import java.util.Dictionary;
+import java.util.Enumeration;
+
+import org.osgi.service.upnp.UPnPStateVariable;
+
+/**
+ * @author donsez
+ */
+public class UPnPEventListenerUtil {
+
+ /**
+ * trace the event received by org.osgi.service.upnp.UPnPEventListener
+ *
+ * @param deviceId
+ * ID of the device sending the events
+ * @param serviceId
+ * ID of the service sending the events
+ * @param events
+ * Dictionary object containing the new values for the state
+ * variables that have changed.
+ * @see
org.osgi.service.upnp.UPnPEventListener#notifyUPnPEvent(java.lang.String,
+ * java.lang.String, java.util.Dictionary)
+ */
+
+ public static void traceEvent(PrintStream printStream, String deviceId,
+ String serviceId, Dictionary events) {
+
+ StringBuffer sb = new StringBuffer();
+ sb.append("UPnPEvent:[deviceId=").append(deviceId);
+ sb.append(",serviceId=").append(serviceId);
+ sb.append(",[");
+ Enumeration enumeration = events.keys();
+ while (enumeration.hasMoreElements()) {
+ Object key = enumeration.nextElement();
+ Object newValue = events.get(key);
+ Object name;
+ if (key instanceof UPnPStateVariable) {
+ /*
+ * 25.8 says: One or multiple events are passed
as parameters to
+ * the notifyUPnPEvent( String
,String,Dictionary) method. The
+ * Dictionary object holds a pair of
UpnPStateVariab le objects
+ * that triggered the event and an Object for
the new value of
+ * the state variable.
+ */
+ name = ((UPnPStateVariable) key).getName();
+ } else {
+ name = key;
+ }
+ sb.append("[\"").append(name).append(
+ "\"(" + newValue.getClass().getName() +
"),");
+ sb.append(newValue).append("]");
+ if (enumeration.hasMoreElements())
+ sb.append(',');
+ }
+ sb.append("]]");
+ String msg = sb.toString();
+ printStream.println(msg);
+
+ }
+}
\ No newline at end of file
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPEventListenerUtil.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPEventNotifier.java
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPEventNotifier.java?view=auto&rev=533875
==============================================================================
---
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPEventNotifier.java
(added)
+++
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPEventNotifier.java
Mon Apr 30 16:15:05 2007
@@ -0,0 +1,205 @@
+/*
+DomoWare OSGi UPnP Sample TV Device is an implementation of UPnP Device
service to be used with OSGi Framework
+Copyright (C) 2004 Matteo Demuru, Francesco Furfari, Stefano "Kismet" Lenzi
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+You can contact us at:
+ {matte-d, sygent, kismet-sl} [at] users.sourceforge.net
+*/
+package org.apache.felix.upnp.devicegen.util;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.Dictionary;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.upnp.UPnPDevice;
+import org.osgi.service.upnp.UPnPEventListener;
+import org.osgi.service.upnp.UPnPService;
+import org.osgi.service.upnp.UPnPStateVariable;
+
+/**
+ * UPnPEventNotifier.java 8-feb-2005
+ * @author Francesco Furfari
+ */
+public class UPnPEventNotifier implements
PropertyChangeListener,ServiceListener {
+ BundleContext context;
+ UPnPDevice device;
+ UPnPService service;
+ EventSource source;
+
+ Properties UPnPTargetListener;
+ String deviceId;
+ String serviceId;
+ Vector upnpListeners = new Vector();
+
+ public UPnPEventNotifier(BundleContext context,UPnPDevice
device,UPnPService service,EventSource source){
+ if ((context == null) || (device == null) || (service == null))
+ throw new IllegalArgumentException("Illegal arguments in
UPnPEventNotifier constructor.");
+ this.context=context;
+ this.device=device;
+ this.service=service;
+ this.source=source;
+ this.serviceId=service.getId();
+ setupUPnPListenerHouseKeeping(device);
+ }
+
+ /**
+ * @param deviceId
+ */
+ private void setupUPnPListenerHouseKeeping(UPnPDevice device) {
+ UPnPTargetListener = new Properties();
+ Dictionary dict = device.getDescriptions(null);
+ deviceId = (String) dict.get(UPnPDevice.ID);
+ UPnPTargetListener.put(UPnPDevice.ID,deviceId);
+ UPnPTargetListener.put(UPnPService.ID,serviceId);
+
UPnPTargetListener.put(UPnPDevice.TYPE,dict.get(UPnPDevice.TYPE));
+ UPnPTargetListener.put(UPnPService.TYPE,service.getType());
+ String ANY_UPnPEventListener =
"("+Constants.OBJECTCLASS+"="+UPnPEventListener.class.getName()+")";
+
+ ServiceReference[] listeners = null;
+ try {
+ listeners =
context.getServiceReferences(UPnPEventListener.class.getName(),null);
+ if (listeners != null){
+ for (int i = 0;i<listeners.length;i++){
+ ServiceReference sr = listeners[i];
+ Filter filter = (Filter)
sr.getProperty(UPnPEventListener.UPNP_FILTER);
+ if (filter == null) addNewListener(sr);
+ else {
+ if
(filter.match(UPnPTargetListener))
+ addNewListener(sr);
+ }
+ }
+ }
+ } catch (Exception ex) {
+ System.out.println(ex);
+ }
+
+ try {
+ String filter = ANY_UPnPEventListener;
+ context.addServiceListener(this,filter);
+ } catch (Exception ex) {
+ System.out.println(ex);
+ }
+
+ if (source!=null){
+ UPnPStateVariable[] vars = service.getStateVariables();
+ if (vars != null){
+ for (int i=0;i<vars.length;i++)
+ if(vars[i].sendsEvents())
+
source.addPropertyChangeListener(vars[i].getName(),this);
+ }
+ }
+
+
+ }
+
+ /* (non-Javadoc)
+ * @see
java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
+ */
+ public void propertyChange(PropertyChangeEvent evt) {
+ Iterator list = upnpListeners.iterator();
+ String property = evt.getPropertyName();
+ Object value = evt.getNewValue();
+ //String valueString = value.toString();
+ final Properties events = new Properties();
+ //events.put(property,valueString);
+ events.put(property,value);
+ while (list.hasNext()){
+ final ServiceReference sr =
(ServiceReference)list.next();
+ String[] props =sr.getPropertyKeys();
+ new Thread(null,null,"UPnPEventNotifier"){
+ public void run(){
+ try {
+ UPnPEventListener listener =
(UPnPEventListener) context.getService(sr);
+
listener.notifyUPnPEvent(deviceId,serviceId,events);
+ context.ungetService(sr);
+ } catch (Exception ex){
+
System.out.println("UPnPEventNotifier Err: " + ex);
+
System.out.println("UPnPEventNotifier bundleId: " +
context.getBundle().getBundleId());
+
System.out.println("UPnPEventNotifier listener: " + context.getService(sr));
+
System.out.println("UPnPEventNotifier sr: " +sr);
+ ex.printStackTrace(System.out);
+ }
+ }
+ }.start();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see
org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
+ */
+ public void serviceChanged(ServiceEvent e) {
+ switch(e.getType()){
+ case ServiceEvent.REGISTERED:{
+ ServiceReference sr = e.getServiceReference();
+ Filter filter = (Filter)
sr.getProperty(UPnPEventListener.UPNP_FILTER);
+ if (filter == null) addNewListener(sr);
+ else {
+ if (filter.match(UPnPTargetListener))
+ addNewListener(sr);
+ }
+ };break;
+
+ case ServiceEvent.MODIFIED:{
+ ServiceReference sr = e.getServiceReference();
+ Filter filter = (Filter)
sr.getProperty(UPnPEventListener.UPNP_FILTER);
+ removeListener(sr);
+ if (filter == null)
+ addNewListener(sr);
+ else {
+ if (filter.match(UPnPTargetListener))
+ addNewListener(sr);
+ }
+ };break;
+
+ case ServiceEvent.UNREGISTERING:{
+ removeListener(e.getServiceReference());
+ };break;
+
+ }
+
+ }
+
+ private void removeListener(ServiceReference reference) {
+ upnpListeners.remove(reference);
+ }
+
+ private void addNewListener(ServiceReference reference) {
+ upnpListeners.add(reference);
+ UPnPStateVariable[] vars = service.getStateVariables();
+ if (vars != null){
+ for (int i=0;i<vars.length;i++)
+ if(vars[i].sendsEvents()){
+ Object value =
((UPnPStateVariableDescriptor) vars[i]).getValue();
+ propertyChange(new
PropertyChangeEvent(this,vars[i].getName(),value,value));
+ }
+ }
+ }
+
+ public void destroy(){
+ context.removeServiceListener(this);
+ upnpListeners.removeAllElements();
+ }
+}
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPEventNotifier.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPStateVariableDescriptor.java
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPStateVariableDescriptor.java?view=auto&rev=533875
==============================================================================
---
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPStateVariableDescriptor.java
(added)
+++
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPStateVariableDescriptor.java
Mon Apr 30 16:15:05 2007
@@ -0,0 +1,33 @@
+/*
+DomoWare UPnP Base Driver is an implementation of the OSGi UnP Device
Specifaction
+Copyright (C) 2005 Matteo Demuru, Francesco Furfari, Stefano "Kismet" Lenzi
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+You can contact us at:
+ {matte-d, sygent, kismet-sl} [at] users.sourceforge.net
+*/
+
+package org.apache.felix.upnp.devicegen.util;
+
+import org.osgi.service.upnp.UPnPStateVariable;
+
+/**
+ * UPnPStateVariableDescriptor.java 22-gen-2005
+ * @author Francesco Furfari
+ */
+public interface UPnPStateVariableDescriptor extends UPnPStateVariable {
+ Object getValue();
+}
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPStateVariableDescriptor.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPSubscriber.java
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPSubscriber.java?view=auto&rev=533875
==============================================================================
---
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPSubscriber.java
(added)
+++
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPSubscriber.java
Mon Apr 30 16:15:05 2007
@@ -0,0 +1,142 @@
+/*
+DomoWare OSGi UPnP Sample TV Device is an implementation of UPnP Device
service to be used with OSGi Framework
+Copyright (C) 2004 Matteo Demuru, Francesco Furfari, Stefano "Kismet" Lenzi
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+You can contact us at:
+ {matte-d, sygent, kismet-sl} [at] users.sourceforge.net
+*/
+package org.apache.felix.upnp.devicegen.util;
+
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.upnp.UPnPDevice;
+import org.osgi.service.upnp.UPnPEventListener;
+import org.osgi.service.upnp.UPnPService;
+
+/**
+ * UPnPSubscriber.java 8-feb-2005
+ * @author Francesco Furfari
+ */
+public class UPnPSubscriber {
+ private BundleContext context;
+ private UPnPEventListener listener;
+ private HashMap hash;
+
+ private class Subscription implements UPnPEventListener{
+ ServiceRegistration registration;
+
+ Subscription(String keys){
+ try {
+ Filter filter = context.createFilter(keys);
+ Properties props = new Properties();
+ props.put(UPnPEventListener.UPNP_FILTER,
filter);
+ registration =
context.registerService(UPnPEventListener.class.getName(), this, props);
+ }catch (Exception ex){
+ System.out.println(ex);
+ }
+ }
+
+ public void unsubscribe(){
+ registration.unregister();
+ }
+
+ public void notifyUPnPEvent(String arg0, String arg1, Dictionary arg2)
{
+ listener.notifyUPnPEvent( arg0, arg1, arg2);
+ }
+ }
+
+
+ public UPnPSubscriber(BundleContext context,UPnPEventListener listener){
+ if ((context == null)|| (listener == null))
+ throw new IllegalArgumentException("Illegal arguments in
UPnPSubscriber constructor.");
+ this.context = context;
+ this.listener = listener;
+ hash = new HashMap();
+ }
+
+ public void subscribe(String filter){
+ if (hash.get(filter) == null){
+ hash.put(filter, new Subscription(filter));
+ }
+ }
+
+ public void unsubscribe(String filter){
+ if (hash.containsKey(filter)) {
+ Subscription subscription = (Subscription) hash.get(filter);
+ subscription.unsubscribe();
+ hash.remove(filter);
+ }
+ }
+
+ public void unsubscribeAll(){
+ Iterator list = hash.entrySet().iterator();
+ while (list.hasNext()){
+ Map.Entry entry = (Map.Entry) list.next();
+ Subscription subcription = (Subscription) entry.getValue();
+ subcription.unsubscribe();
+ list.remove();
+ }
+ }
+
+ public String subscribeServiceIdOf(String deviceId, String serviceId){
+ String keys = "(&(" + UPnPDevice.ID + "="+ deviceId + ")(" +
UPnPService.ID + "=" + serviceId + "))";
+ subscribe(keys);
+ return keys;
+ }
+
+ public String subscribeServiceTypeOf(String deviceId, String
serviceType){
+ String keys = "(&(" + UPnPDevice.ID + "="+ deviceId + ")(" +
UPnPService.TYPE + "=" + serviceType + "))";
+ subscribe(keys);
+ return keys;
+ }
+
+ public String subscribeEveryServiceType(String deviceType, String
serviceType){
+ String keys = "(&(" + UPnPDevice.TYPE + "="+ deviceType + ")("
+ UPnPService.TYPE + "=" + serviceType + "))";
+ subscribe(keys);
+ return keys;
+ }
+
+ public String subscribeAllServicesOf(String deviceId){
+ String keys = "(" + UPnPDevice.ID + "="+ deviceId + ")";
+ subscribe(keys);
+ return keys;
+ }
+
+ public String subscribeEveryDeviceTypeServices(String deviceType){
+ String keys = "(" + UPnPDevice.TYPE + "="+ deviceType + ")";
+ subscribe(keys);
+ return keys;
+ }
+
+
+ public void unsubscribeServiceIdOf(String deviceId, String serviceId){
+ String keys = "(&(" + UPnPDevice.ID + "="+ deviceId + ")(" +
UPnPService.ID + "=" + serviceId + "))";
+ unsubscribe(keys);
+ }
+
+ public void unsubscribeAllServicesOf(String deviceId){
+ String keys = "(" + UPnPDevice.ID + "="+ deviceId + ")";
+ unsubscribe(keys);
+ }
+}
\ No newline at end of file
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/java/org/apache/felix/upnp/devicegen/util/UPnPSubscriber.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/Display.png
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/Display.png?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/Display.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/MediaPlayer.png
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/MediaPlayer.png?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/MediaPlayer.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/Printer.png
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/Printer.png?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/Printer.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/Thumbs.db
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/Thumbs.db?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/Thumbs.db
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/Webcam.png
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/Webcam.png?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/Webcam.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/bunny.png
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/bunny.png?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/bunny.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/compass.png
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/compass.png?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/compass.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/device.png
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/device.png?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/device.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/igd.png
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/igd.png?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/igd.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/light.png
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/light.png?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/light.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/ogd.png
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/ogd.png?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/ogd.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/ogd25.png
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/ogd25.png?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/ogd25.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/secure.png
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/secure.png?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/secure.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/thermostat.png
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/thermostat.png?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/thermostat.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Added:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/tv.png
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/tv.png?view=auto&rev=533875
==============================================================================
Binary file - no diff available.
Propchange:
incubator/felix/sandbox/donsez/upnp.devicegen/src/main/resources/icon/tv.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Added: incubator/felix/sandbox/donsez/upnp.devicegen/upnp.devicegen.txt
URL:
http://svn.apache.org/viewvc/incubator/felix/sandbox/donsez/upnp.devicegen/upnp.devicegen.txt?view=auto&rev=533875
==============================================================================
--- incubator/felix/sandbox/donsez/upnp.devicegen/upnp.devicegen.txt (added)
+++ incubator/felix/sandbox/donsez/upnp.devicegen/upnp.devicegen.txt Mon Apr 30
16:15:05 2007
@@ -0,0 +1,9 @@
+# script to launch upnp.devicegen
+
+
+install
file:E:\Felix-Dist\felix-0.8.0-repo\trunk\javax.servlet\target\javax.servlet-0.9.0-incubator-SNAPSHOT.jar
+install
file:E:\Felix-Dist\felix-0.8.0-repo\trunk\org.osgi.compendium\target\org.osgi.compendium-0.9.0-incubator-SNAPSHOT.jar
+
+start
file:E:\Felix-Dist\felix-0.8.0-repo\trunk\upnp.extra\target\org.apache.felix.upnp.extra-0.1.0-incubator-SNAPSHOT.jar
+start
file:E:\Felix-Dist\felix-0.8.0-repo\trunk\upnp.basedriver\target\org.apache.felix.upnp.basedriver-0.1.0-incubator-SNAPSHOT.jar
+start
file:F:\osgi\felix-sandbox-donsez\upnp.devicegen\target\org.apache.felix.upnp.devicegen-0.9.0-incubator-SNAPSHOT.jar
\ No newline at end of file
Propchange: incubator/felix/sandbox/donsez/upnp.devicegen/upnp.devicegen.txt
------------------------------------------------------------------------------
svn:eol-style = native