Added svn properties
Fixed test runtime enviroment boostrap
Fixed dependecy in tester artifact



git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@674879 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/upnp/samples/tv/pom.xml b/upnp/samples/tv/pom.xml
index 8e546c9..2386e4f 100644
--- a/upnp/samples/tv/pom.xml
+++ b/upnp/samples/tv/pom.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>

+<?xml version="1.0" encoding="UTF-8"?>
 <!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
@@ -17,60 +17,60 @@
  specific language governing permissions and limitations
  under the License.
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

-  <parent>

-    <artifactId>felix</artifactId>

-    <groupId>org.apache.felix</groupId>

-    <version>1.0.2</version>

-    <relativePath>../../../pom/pom.xml</relativePath>

-  </parent>

-  <modelVersion>4.0.0</modelVersion>

-  <groupId>org.apache.felix</groupId>

-  <artifactId>org.apache.felix.upnp.sample.tv</artifactId>

-  <packaging>bundle</packaging>

-  <name>Apache Felix UPnP Sample TV</name>

-  <version>0.2.0-SNAPSHOT</version>

-  <build>

-    <plugins>

-      <plugin>

-        <groupId>org.apache.felix</groupId>

-        <artifactId>maven-bundle-plugin</artifactId>

+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <artifactId>felix</artifactId>
+    <groupId>org.apache.felix</groupId>
+    <version>1.0.2</version>
+    <relativePath>../../../pom/pom.xml</relativePath>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.felix</groupId>
+  <artifactId>org.apache.felix.upnp.sample.tv</artifactId>
+  <packaging>bundle</packaging>
+  <name>Apache Felix UPnP Sample TV</name>
+  <version>0.2.0-SNAPSHOT</version>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
         <version>1.4.0</version>
-        <extensions>true</extensions>

-        <configuration>

-          <instructions>

-            <Bundle-Name>${pom.name}</Bundle-Name>

+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Bundle-Name>${pom.name}</Bundle-Name>
             <Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
-            <Bundle-Author>Matteo Demuru &lt;demuru@apache.org&gt;,Francesco Furfari &lt;furfari@apache.org&gt;,Stefano "Kismet" Lenzi &lt;lenzi@apache.org&gt;</Bundle-Author>

-            <Bundle-Description>CyberLink Tv clone to test UPnPBase driver</Bundle-Description>

-            <Bundle-SymbolicName>org.apache.felix.upnp.sample.tv</Bundle-SymbolicName>

-            <Bundle-Activator>org.apache.felix.upnp.sample.tv.Activator</Bundle-Activator>

-            <Private-Package>org.apache.felix.upnp.sample.tv.*</Private-Package>

-            <Import-Package>*</Import-Package>

-          </instructions>

-        </configuration>

-      </plugin>

-    </plugins>

-  </build>

-  <dependencies>

-    <dependency>

-      <groupId>${pom.groupId}</groupId>

-      <artifactId>org.osgi.core</artifactId>

-      <version>1.1.0-SNAPSHOT</version>

-      <scope>provided</scope>

-    </dependency>

-    <dependency>

-      <groupId>${pom.groupId}</groupId>

-      <artifactId>org.osgi.compendium</artifactId>

+            <Bundle-Author>Matteo Demuru &lt;demuru@apache.org&gt;,Francesco Furfari &lt;furfari@apache.org&gt;,Stefano "Kismet" Lenzi &lt;lenzi@apache.org&gt;</Bundle-Author>
+            <Bundle-Description>CyberLink Tv clone to test UPnPBase driver</Bundle-Description>
+            <Bundle-SymbolicName>org.apache.felix.upnp.sample.tv</Bundle-SymbolicName>
+            <Bundle-Activator>org.apache.felix.upnp.sample.tv.Activator</Bundle-Activator>
+            <Private-Package>org.apache.felix.upnp.sample.tv.*</Private-Package>
+            <Import-Package>*</Import-Package>
+          </instructions>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <dependencies>
+    <dependency>
+      <groupId>${pom.groupId}</groupId>
+      <artifactId>org.osgi.core</artifactId>
+      <version>1.1.0-SNAPSHOT</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>${pom.groupId}</groupId>
+      <artifactId>org.osgi.compendium</artifactId>
       <version>1.0.0</version>
-      <scope>provided</scope>

-    </dependency>

-    <dependency>

-      <groupId>org.apache.felix</groupId>

-      <artifactId>org.apache.felix.upnp.extra</artifactId>

-      <version>0.3.0-SNAPSHOT</version>

-      <scope>provided</scope>

-    </dependency>

-  </dependencies>

-</project>

-

+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.upnp.extra</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+</project>
+
diff --git a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/GetPowerAction.java b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/GetPowerAction.java
index 3c786df..5106e1d 100644
--- a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/GetPowerAction.java
+++ b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/GetPowerAction.java
@@ -1,85 +1,85 @@
-/* 

- * Licensed to the Apache Software Foundation (ASF) under one

- * or more contributor license agreements.  See the NOTICE file

- * distributed with this work for additional information

- * regarding copyright ownership.  The ASF licenses this file

- * to you under the Apache License, Version 2.0 (the

- * "License"); you may not use this file except in compliance

- * with the License.  You may obtain a copy of the License at

- *

- *   http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing,

- * software distributed under the License is distributed on an

- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

- * KIND, either express or implied.  See the License for the

- * specific language governing permissions and limitations

- * under the License.

- */

-

-package org.apache.felix.upnp.sample.tv;

-

-import java.util.Dictionary;

-import java.util.Hashtable;

-

-import org.osgi.service.upnp.UPnPAction;

-import org.osgi.service.upnp.UPnPStateVariable;

-

-public class GetPowerAction implements UPnPAction {

-

-	final private String NAME = "GetPower";

-	final private String RESULT_STATUS = "Power";

-	final private String[] OUT_ARG_NAMES = new String[]{RESULT_STATUS};

-	private PowerStateVariable power;

-	

-	

-	public GetPowerAction(PowerStateVariable power){

-		this.power = power;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPAction#getName()

-	 */

-	public String getName() {

-		return NAME;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPAction#getReturnArgumentName()

-	 */

-	public String getReturnArgumentName() {

-		return null;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPAction#getInputArgumentNames()

-	 */

-	public String[] getInputArgumentNames() {

-		

-		return null;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPAction#getOutputArgumentNames()

-	 */

-	public String[] getOutputArgumentNames() {

-		return OUT_ARG_NAMES;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPAction#getStateVariable(java.lang.String)

-	 */

-	public UPnPStateVariable getStateVariable(String argumentName) {

-		return power;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPAction#invoke(java.util.Dictionary)

-	 */

-	public Dictionary invoke(Dictionary args) throws Exception {

-		Boolean value = power.getCurrentPower();

-		Hashtable result = new Hashtable();

-		result.put(RESULT_STATUS,value);

-		return result;

-	}

-}

+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.upnp.sample.tv;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.osgi.service.upnp.UPnPAction;
+import org.osgi.service.upnp.UPnPStateVariable;
+
+public class GetPowerAction implements UPnPAction {
+
+	final private String NAME = "GetPower";
+	final private String RESULT_STATUS = "Power";
+	final private String[] OUT_ARG_NAMES = new String[]{RESULT_STATUS};
+	private PowerStateVariable power;
+	
+	
+	public GetPowerAction(PowerStateVariable power){
+		this.power = power;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPAction#getName()
+	 */
+	public String getName() {
+		return NAME;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPAction#getReturnArgumentName()
+	 */
+	public String getReturnArgumentName() {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPAction#getInputArgumentNames()
+	 */
+	public String[] getInputArgumentNames() {
+		
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPAction#getOutputArgumentNames()
+	 */
+	public String[] getOutputArgumentNames() {
+		return OUT_ARG_NAMES;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPAction#getStateVariable(java.lang.String)
+	 */
+	public UPnPStateVariable getStateVariable(String argumentName) {
+		return power;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPAction#invoke(java.util.Dictionary)
+	 */
+	public Dictionary invoke(Dictionary args) throws Exception {
+		Boolean value = power.getCurrentPower();
+		Hashtable result = new Hashtable();
+		result.put(RESULT_STATUS,value);
+		return result;
+	}
+}
diff --git a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/PowerService.java b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/PowerService.java
index 347d9fc..2352dde 100644
--- a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/PowerService.java
+++ b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/PowerService.java
@@ -1,103 +1,103 @@
-/* 

- * Licensed to the Apache Software Foundation (ASF) under one

- * or more contributor license agreements.  See the NOTICE file

- * distributed with this work for additional information

- * regarding copyright ownership.  The ASF licenses this file

- * to you under the Apache License, Version 2.0 (the

- * "License"); you may not use this file except in compliance

- * with the License.  You may obtain a copy of the License at

- *

- *   http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing,

- * software distributed under the License is distributed on an

- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

- * KIND, either express or implied.  See the License for the

- * specific language governing permissions and limitations

- * under the License.

- */

-

-package org.apache.felix.upnp.sample.tv;

-

-import java.util.HashMap;

-

-import org.osgi.service.upnp.UPnPAction;

-import org.osgi.service.upnp.UPnPService;

-import org.osgi.service.upnp.UPnPStateVariable;

-

-public class PowerService implements UPnPService {

-	final private String SERVICE_ID = "urn:schemas-upnp-org:serviceId:power:1";

-	final private String SERVICE_TYPE = "urn:schemas-upnp-org:service:power:1";

-	final private String VERSION ="1";

-

-	private PowerStateVariable power;

-	private ResultStateVariable result;

-	private UPnPStateVariable[] states;

-	private HashMap actions = new HashMap();

-	

-	

-	public PowerService(){

-		power = new PowerStateVariable();

-		result = new ResultStateVariable();

-		this.states = new UPnPStateVariable[]{power,result};

-		

-		UPnPAction setPower= new SetPowerAction(power,result);

-		UPnPAction getPower = new GetPowerAction(power);

-		actions.put(setPower.getName(),setPower);

-		actions.put(getPower.getName(),getPower);

-		

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPService#getId()

-	 */

-	public String getId() {

-		return SERVICE_ID;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPService#getType()

-	 */

-	public String getType() {

-		return SERVICE_TYPE;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPService#getVersion()

-	 */

-	public String getVersion() {

-		return VERSION;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPService#getAction(java.lang.String)

-	 */

-	public UPnPAction getAction(String name) {

-		return (UPnPAction)actions.get(name);

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPService#getActions()

-	 */

-	public UPnPAction[] getActions() {

-		return (UPnPAction[])(actions.values()).toArray(new UPnPAction[]{});

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPService#getStateVariables()

-	 */

-	public UPnPStateVariable[] getStateVariables() {

-		return states;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPService#getStateVariable(java.lang.String)

-	 */

-	public UPnPStateVariable getStateVariable(String name) {

-		if (name.equals("Power"))

-			return power;

-		else if (name.equals("Result"))

-			return result;

-		else return null;

-	}

-}

+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.upnp.sample.tv;
+
+import java.util.HashMap;
+
+import org.osgi.service.upnp.UPnPAction;
+import org.osgi.service.upnp.UPnPService;
+import org.osgi.service.upnp.UPnPStateVariable;
+
+public class PowerService implements UPnPService {
+	final private String SERVICE_ID = "urn:schemas-upnp-org:serviceId:power:1";
+	final private String SERVICE_TYPE = "urn:schemas-upnp-org:service:power:1";
+	final private String VERSION ="1";
+
+	private PowerStateVariable power;
+	private ResultStateVariable result;
+	private UPnPStateVariable[] states;
+	private HashMap actions = new HashMap();
+	
+	
+	public PowerService(){
+		power = new PowerStateVariable();
+		result = new ResultStateVariable();
+		this.states = new UPnPStateVariable[]{power,result};
+		
+		UPnPAction setPower= new SetPowerAction(power,result);
+		UPnPAction getPower = new GetPowerAction(power);
+		actions.put(setPower.getName(),setPower);
+		actions.put(getPower.getName(),getPower);
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPService#getId()
+	 */
+	public String getId() {
+		return SERVICE_ID;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPService#getType()
+	 */
+	public String getType() {
+		return SERVICE_TYPE;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPService#getVersion()
+	 */
+	public String getVersion() {
+		return VERSION;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPService#getAction(java.lang.String)
+	 */
+	public UPnPAction getAction(String name) {
+		return (UPnPAction)actions.get(name);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPService#getActions()
+	 */
+	public UPnPAction[] getActions() {
+		return (UPnPAction[])(actions.values()).toArray(new UPnPAction[]{});
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPService#getStateVariables()
+	 */
+	public UPnPStateVariable[] getStateVariables() {
+		return states;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPService#getStateVariable(java.lang.String)
+	 */
+	public UPnPStateVariable getStateVariable(String name) {
+		if (name.equals("Power"))
+			return power;
+		else if (name.equals("Result"))
+			return result;
+		else return null;
+	}
+}
diff --git a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/PowerStateVariable.java b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/PowerStateVariable.java
index ef66bc0..1507bb8 100644
--- a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/PowerStateVariable.java
+++ b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/PowerStateVariable.java
@@ -1,120 +1,120 @@
-/* 

- * Licensed to the Apache Software Foundation (ASF) under one

- * or more contributor license agreements.  See the NOTICE file

- * distributed with this work for additional information

- * regarding copyright ownership.  The ASF licenses this file

- * to you under the Apache License, Version 2.0 (the

- * "License"); you may not use this file except in compliance

- * with the License.  You may obtain a copy of the License at

- *

- *   http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing,

- * software distributed under the License is distributed on an

- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

- * KIND, either express or implied.  See the License for the

- * specific language governing permissions and limitations

- * under the License.

- */

-

-package org.apache.felix.upnp.sample.tv;

-import java.beans.PropertyChangeEvent;

-

-import org.osgi.service.upnp.UPnPLocalStateVariable;

-

-import org.apache.felix.upnp.extra.util.UPnPEventNotifier;

-

-public class PowerStateVariable implements UPnPLocalStateVariable {

-	

-	final private String NAME = "Power";

-	final private Boolean DEFAULT_VALUE = Boolean.FALSE;

-	private UPnPEventNotifier notifier;

-	private Boolean power = Boolean.FALSE;

-	

-	public PowerStateVariable(){

-	}

-	

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getName()

-	 */

-	public String getName() {

-		return NAME;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getJavaDataType()

-	 */

-	public Class getJavaDataType() {

-		return Boolean.class;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getUPnPDataType()

-	 */

-	public String getUPnPDataType() {

-		return TYPE_BOOLEAN;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getDefaultValue()

-	 */

-	public Object getDefaultValue() {

-		return DEFAULT_VALUE;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getAllowedValues()

-	 */

-	public String[] getAllowedValues() {

-		return null;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getMinimum()

-	 */

-	public Number getMinimum() {

-		return null;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getMaximum()

-	 */

-	public Number getMaximum() {

-		return null;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getStep()

-	 */

-	public Number getStep() {

-		return null;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#sendsEvents()

-	 */

-	public boolean sendsEvents() {

-		return true;

-	}

-	

-	public Boolean getCurrentPower(){

-		return power;

-	}

-	

-	public void setPower(Boolean value){

-		if (!value.equals(power)) {

-			Boolean oldValue = power;

-			power = value;

-			if (notifier != null)

-			notifier.propertyChange(new PropertyChangeEvent(this,"Power",oldValue,value));

-		}

-	}

-

-	public void setNotifier(UPnPEventNotifier notifier){

-		this.notifier = notifier;

-	}

-

-    public Object getCurrentValue() {

-         return power;

-    }

-}

+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.upnp.sample.tv;
+import java.beans.PropertyChangeEvent;
+
+import org.osgi.service.upnp.UPnPLocalStateVariable;
+
+import org.apache.felix.upnp.extra.util.UPnPEventNotifier;
+
+public class PowerStateVariable implements UPnPLocalStateVariable {
+	
+	final private String NAME = "Power";
+	final private Boolean DEFAULT_VALUE = Boolean.FALSE;
+	private UPnPEventNotifier notifier;
+	private Boolean power = Boolean.FALSE;
+	
+	public PowerStateVariable(){
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getName()
+	 */
+	public String getName() {
+		return NAME;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getJavaDataType()
+	 */
+	public Class getJavaDataType() {
+		return Boolean.class;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getUPnPDataType()
+	 */
+	public String getUPnPDataType() {
+		return TYPE_BOOLEAN;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getDefaultValue()
+	 */
+	public Object getDefaultValue() {
+		return DEFAULT_VALUE;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getAllowedValues()
+	 */
+	public String[] getAllowedValues() {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getMinimum()
+	 */
+	public Number getMinimum() {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getMaximum()
+	 */
+	public Number getMaximum() {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getStep()
+	 */
+	public Number getStep() {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#sendsEvents()
+	 */
+	public boolean sendsEvents() {
+		return true;
+	}
+	
+	public Boolean getCurrentPower(){
+		return power;
+	}
+	
+	public void setPower(Boolean value){
+		if (!value.equals(power)) {
+			Boolean oldValue = power;
+			power = value;
+			if (notifier != null)
+			notifier.propertyChange(new PropertyChangeEvent(this,"Power",oldValue,value));
+		}
+	}
+
+	public void setNotifier(UPnPEventNotifier notifier){
+		this.notifier = notifier;
+	}
+
+    public Object getCurrentValue() {
+         return power;
+    }
+}
diff --git a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/ResultStateVariable.java b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/ResultStateVariable.java
index a50ef03..b64ac28 100644
--- a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/ResultStateVariable.java
+++ b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/ResultStateVariable.java
@@ -1,95 +1,95 @@
-/* 

- * Licensed to the Apache Software Foundation (ASF) under one

- * or more contributor license agreements.  See the NOTICE file

- * distributed with this work for additional information

- * regarding copyright ownership.  The ASF licenses this file

- * to you under the Apache License, Version 2.0 (the

- * "License"); you may not use this file except in compliance

- * with the License.  You may obtain a copy of the License at

- *

- *   http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing,

- * software distributed under the License is distributed on an

- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

- * KIND, either express or implied.  See the License for the

- * specific language governing permissions and limitations

- * under the License.

- */

-

-package org.apache.felix.upnp.sample.tv;

-import org.osgi.service.upnp.UPnPStateVariable;

-

-public class ResultStateVariable implements UPnPStateVariable{

-	

-	final private String NAME = "Result";

-	final private Boolean DEFAULT_VALUE = Boolean.FALSE;

-	

-	

-	public ResultStateVariable(){

-	}

-	

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getName()

-	 */

-	public String getName() {

-		return NAME;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getJavaDataType()

-	 */

-	public Class getJavaDataType() {

-		return Boolean.class;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getUPnPDataType()

-	 */

-	public String getUPnPDataType() {

-		return TYPE_BOOLEAN;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getDefaultValue()

-	 */

-	public Object getDefaultValue() {

-		return DEFAULT_VALUE;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getAllowedValues()

-	 */

-	public String[] getAllowedValues() {

-		return null;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getMinimum()

-	 */

-	public Number getMinimum() {

-		return null;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getMaximum()

-	 */

-	public Number getMaximum() {

-		return null;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#getStep()

-	 */

-	public Number getStep() {

-		return null;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPStateVariable#sendsEvents()

-	 */

-	public boolean sendsEvents() {

-		return false;

-	}

-	

-}

+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.upnp.sample.tv;
+import org.osgi.service.upnp.UPnPStateVariable;
+
+public class ResultStateVariable implements UPnPStateVariable{
+	
+	final private String NAME = "Result";
+	final private Boolean DEFAULT_VALUE = Boolean.FALSE;
+	
+	
+	public ResultStateVariable(){
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getName()
+	 */
+	public String getName() {
+		return NAME;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getJavaDataType()
+	 */
+	public Class getJavaDataType() {
+		return Boolean.class;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getUPnPDataType()
+	 */
+	public String getUPnPDataType() {
+		return TYPE_BOOLEAN;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getDefaultValue()
+	 */
+	public Object getDefaultValue() {
+		return DEFAULT_VALUE;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getAllowedValues()
+	 */
+	public String[] getAllowedValues() {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getMinimum()
+	 */
+	public Number getMinimum() {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getMaximum()
+	 */
+	public Number getMaximum() {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#getStep()
+	 */
+	public Number getStep() {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPStateVariable#sendsEvents()
+	 */
+	public boolean sendsEvents() {
+		return false;
+	}
+	
+}
diff --git a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/SetPowerAction.java b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/SetPowerAction.java
index 30d67ff..909bdc8 100644
--- a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/SetPowerAction.java
+++ b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/SetPowerAction.java
@@ -1,91 +1,91 @@
-/* 

- * Licensed to the Apache Software Foundation (ASF) under one

- * or more contributor license agreements.  See the NOTICE file

- * distributed with this work for additional information

- * regarding copyright ownership.  The ASF licenses this file

- * to you under the Apache License, Version 2.0 (the

- * "License"); you may not use this file except in compliance

- * with the License.  You may obtain a copy of the License at

- *

- *   http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing,

- * software distributed under the License is distributed on an

- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

- * KIND, either express or implied.  See the License for the

- * specific language governing permissions and limitations

- * under the License.

- */

-

-package org.apache.felix.upnp.sample.tv;

-

-import java.util.Dictionary;

-import java.util.Hashtable;

-

-import org.osgi.service.upnp.UPnPAction;

-import org.osgi.service.upnp.UPnPStateVariable;

-

-public class SetPowerAction implements UPnPAction {

-

-	final private String NAME = "SetPower";

-	final private String NEW_TIME_VALUE = "Power";

-	final private String NEW_RESULT_VALUE = "Result";

-	final private String[] IN_ARG_NAMES = new String[]{NEW_TIME_VALUE};

-	final private String[] OUT_ARG_NAMES = new String[]{NEW_RESULT_VALUE};

-	private PowerStateVariable power;

-	private ResultStateVariable result;

-	

-	

-	public SetPowerAction(PowerStateVariable power,ResultStateVariable result){

-		this.power = power;

-		this.result=result;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPAction#getName()

-	 */

-	public String getName() {

-		return NAME;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPAction#getReturnArgumentName()

-	 */

-	public String getReturnArgumentName() {

-		return "Result";

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPAction#getInputArgumentNames()

-	 */

-	public String[] getInputArgumentNames() {

-		return IN_ARG_NAMES;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPAction#getOutputArgumentNames()

-	 */

-	public String[] getOutputArgumentNames() {

-		return OUT_ARG_NAMES;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPAction#getStateVariable(java.lang.String)

-	 */

-	public UPnPStateVariable getStateVariable(String argumentName) {

-		if (argumentName.equals("Power")) return power;

-		else if (argumentName.equals("Result")) return result;

-		else return null;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPAction#invoke(java.util.Dictionary)

-	 */

-	public Dictionary invoke(Dictionary args) throws Exception {

-		Boolean value = (Boolean) args.get(NEW_TIME_VALUE);

-		power.setPower(value);

-		Hashtable result = new Hashtable();

-		result.put(NEW_RESULT_VALUE,Boolean.TRUE);

-		return result;

-	}

-}

+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.upnp.sample.tv;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.osgi.service.upnp.UPnPAction;
+import org.osgi.service.upnp.UPnPStateVariable;
+
+public class SetPowerAction implements UPnPAction {
+
+	final private String NAME = "SetPower";
+	final private String NEW_TIME_VALUE = "Power";
+	final private String NEW_RESULT_VALUE = "Result";
+	final private String[] IN_ARG_NAMES = new String[]{NEW_TIME_VALUE};
+	final private String[] OUT_ARG_NAMES = new String[]{NEW_RESULT_VALUE};
+	private PowerStateVariable power;
+	private ResultStateVariable result;
+	
+	
+	public SetPowerAction(PowerStateVariable power,ResultStateVariable result){
+		this.power = power;
+		this.result=result;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPAction#getName()
+	 */
+	public String getName() {
+		return NAME;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPAction#getReturnArgumentName()
+	 */
+	public String getReturnArgumentName() {
+		return "Result";
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPAction#getInputArgumentNames()
+	 */
+	public String[] getInputArgumentNames() {
+		return IN_ARG_NAMES;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPAction#getOutputArgumentNames()
+	 */
+	public String[] getOutputArgumentNames() {
+		return OUT_ARG_NAMES;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPAction#getStateVariable(java.lang.String)
+	 */
+	public UPnPStateVariable getStateVariable(String argumentName) {
+		if (argumentName.equals("Power")) return power;
+		else if (argumentName.equals("Result")) return result;
+		else return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPAction#invoke(java.util.Dictionary)
+	 */
+	public Dictionary invoke(Dictionary args) throws Exception {
+		Boolean value = (Boolean) args.get(NEW_TIME_VALUE);
+		power.setPower(value);
+		Hashtable result = new Hashtable();
+		result.put(NEW_RESULT_VALUE,Boolean.TRUE);
+		return result;
+	}
+}
diff --git a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvDevice.java b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvDevice.java
index e7b70ae..f5a0d02 100644
--- a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvDevice.java
+++ b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvDevice.java
@@ -1,319 +1,319 @@
-/* 

- * Licensed to the Apache Software Foundation (ASF) under one

- * or more contributor license agreements.  See the NOTICE file

- * distributed with this work for additional information

- * regarding copyright ownership.  The ASF licenses this file

- * to you under the Apache License, Version 2.0 (the

- * "License"); you may not use this file except in compliance

- * with the License.  You may obtain a copy of the License at

- *

- *   http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing,

- * software distributed under the License is distributed on an

- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

- * KIND, either express or implied.  See the License for the

- * specific language governing permissions and limitations

- * under the License.

- */

-

-package org.apache.felix.upnp.sample.tv;

-

-import java.awt.Component;

-import java.util.ArrayList;

-import java.util.Date;

-import java.util.Dictionary;

-import java.util.Properties;

-import java.util.Random;

-

-import org.osgi.framework.BundleContext;

-import org.osgi.framework.Constants;

-import org.osgi.framework.InvalidSyntaxException;

-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.UPnPIcon;

-import org.osgi.service.upnp.UPnPService;

-

-import org.apache.felix.upnp.extra.util.UPnPEventNotifier;

-import org.apache.felix.upnp.extra.util.UPnPSubscriber;

-

-public class TvDevice implements UPnPDevice,UPnPEventListener,ServiceListener  {

-	

-	final private String DEVICE_ID = "uuid:Felix-TV+" +Integer.toHexString(new Random(System.currentTimeMillis()).nextInt());

-	private final static String CLOCK_DEVICE_TYPE = "urn:schemas-upnp-org:device:clock:1";

-	private final static String TIME_SERVICE_TYPE = "urn:schemas-upnp-org:service:timer:1";

-	

-	private final static String LIGHT_DEVICE_TYPE = "urn:schemas-upnp-org:device:light:1";

-	private final static String POWER_SERVICE_TYPE = "urn:schemas-upnp-org:service:power:1";

-

-	private final static String AIRCON_DEVICE_TYPE = "urn:schemas-upnp-org:device:aircon:1";

-	private final static String TEMP_SERVICE_TYPE = "urn:schemas-upnp-org:service:temp:1";

-	

-	private final static String WASHER_DEVICE_TYPE = "urn:schemas-upnp-org:device:washer:1";

-	private final static String STATUS_SERVICE_TYPE = "urn:schemas-upnp-org:service:state:1";

-

-	private final String devicesFilter = 

-		"(&"+

-			"("+Constants.OBJECTCLASS+"="+UPnPDevice.class.getName()+"))";

-			/*"(|("+UPnPDevice.TYPE+"="+ CLOCK_SERVICE_TYPE+")"+

-				"("+UPnPDevice.TYPE+"="+ LIGHT_SERVICE_TYPE+")"+

-				"("+UPnPDevice.TYPE+"="+ AIRCON_SERVICE_TYPE+")"+

-				"("+UPnPDevice.TYPE+"="+ WASHER_SERVICE_TYPE+")))";*/

-

-	private BundleContext context;

-	private PowerService powerService;

-	private UPnPService[] services;

-	private Dictionary dictionary;

-	private UPnPEventNotifier notifier;

-	private PowerStateVariable powerState;

-

-	public TvDevice() {

-		powerService = new PowerService();

-		services = new UPnPService[]{powerService};

-		powerState = (PowerStateVariable) powerService.getStateVariable("Power");

-		setupDeviceProperties();

-		buildEventNotifyer();

-		try {

-			Activator.context.addServiceListener(this,devicesFilter);

-		} catch (InvalidSyntaxException e) {

-			System.out.println(e);		

-		}

-	}

-

-	/**

-	 * 

-	 */

-	private void buildEventNotifyer() {

-		notifier = new UPnPEventNotifier(Activator.context,this,powerService);

-		powerState.setNotifier(notifier);

-	}

-

-	private void setupDeviceProperties(){

-		dictionary = new Properties();

-		dictionary.put(UPnPDevice.UPNP_EXPORT,"");

-		//org.osgi.service.device.Constants.DEVICE_CATEGORY

-		//dictionary.put("DEVICE_CATEGORY","UPnP");

-		dictionary.put(

-	        org.osgi.service

-	        	.device.Constants.DEVICE_CATEGORY,

-        	new String[]{UPnPDevice.DEVICE_CATEGORY}

-        );

-		dictionary.put(UPnPDevice.FRIENDLY_NAME,"Felix Sample Tv");

-		dictionary.put(UPnPDevice.MANUFACTURER,"Apache Software Foundation");

-		dictionary.put(UPnPDevice.MANUFACTURER_URL,"http://felix.apache.org");

-		dictionary.put(UPnPDevice.MODEL_DESCRIPTION,"A CyberLink Tv device clone to test OSGi to UPnP service import");

-		dictionary.put(UPnPDevice.MODEL_NAME,"BimbiTv");

-		dictionary.put(UPnPDevice.MODEL_NUMBER,"1.0");

-		dictionary.put(UPnPDevice.MODEL_URL,"http://felix.apache.org/site/upnp-examples.html");

-		//dictionary.put(UPnPDevice.PRESENTATION_URL,"http://felix.apache.org/BimbiTv/presentation");

-		dictionary.put(UPnPDevice.SERIAL_NUMBER,"123456789");

-		dictionary.put(UPnPDevice.TYPE,"urn:schemas-upnp-org:device:tv:1");

-		dictionary.put(UPnPDevice.UDN,DEVICE_ID);

-		//dictionary.put(UPnPDevice.ID,dictionary.get(UPnPDevice.UDN));

-		dictionary.put(UPnPDevice.UPC,"1213456789");

-	}

-	

-	

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPDevice#getService(java.lang.String)

-	 */

-	public UPnPService getService(String serviceId) {

-		if  (serviceId.equals(powerService.getId())) return powerService;

-		return null;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPDevice#getServices()

-	 */

-	public UPnPService[] getServices() {

-		return services;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPDevice#getIcons(java.lang.String)

-	 */

-	public UPnPIcon[] getIcons(String locale) {

-		UPnPIcon icon = new TvIcon();

-		return new UPnPIcon[]{icon} ;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPDevice#getDescriptions(java.lang.String)

-	 */

-	public Dictionary getDescriptions(String locale) {

-		return dictionary;

-	}

-

-

-

-	////////////////////////////////////////////////

-	//	Component

-	////////////////////////////////////////////////

-

-	private Component comp;

-	

-	public void setComponent(Component comp)

-	{

-		this.comp = comp;	

-	}

-	

-	public Component getComponent()

-	{

-		return comp;

-	}

-	

-	////////////////////////////////////////////////

-	//	on/off

-	////////////////////////////////////////////////

-

-	private boolean onFlag = false;

-	

-	public void on()

-	{

-		powerState.setPower(Boolean.TRUE);

-		doSubscribe();

-	}

-

-	public boolean isOn()

-	{ 

-		return powerState.getCurrentPower().booleanValue();

-	}

-	public void off()

-	{

-		powerState.setPower(Boolean.FALSE);

-		undoSubscribe();

-	}

-

-

-	////////////////////////////////////////////////

-	//	Clock

-	////////////////////////////////////////////////

-

-	private String clockTime = ""; 

-	

-	public String getClockTime()

-	{

-		return clockTime;	

-	}

-	

-	////////////////////////////////////////////////

-	//	Aircon

-	////////////////////////////////////////////////

-

-	private String airconTemp = ""; 

-	

-	public String getAirconTempture()

-	{

-		return airconTemp;	

-	}

-

-	////////////////////////////////////////////////

-	//	Message

-	////////////////////////////////////////////////

-

-	private String message = ""; 

-	

-	public void setMessage(String msg)

-	{

-		message = msg;

-	}

-	

-	public String getMessage()

-	{

-		return message;

-	}

-	

-

-	////////////////////////////////////////////////

-	//	Subscribe

-	////////////////////////////////////////////////

-	

-	private UPnPSubscriber subscriber;

-	

-	public void doSubscribe()

-	{

-		subscriber = new UPnPSubscriber(Activator.context,this);

-		subscriber.subscribeEveryServiceType(CLOCK_DEVICE_TYPE, TIME_SERVICE_TYPE);

-		subscriber.subscribeEveryServiceType(AIRCON_DEVICE_TYPE, TEMP_SERVICE_TYPE);

-		subscriber.subscribeEveryServiceType(LIGHT_DEVICE_TYPE, POWER_SERVICE_TYPE);

-		subscriber.subscribeEveryServiceType(WASHER_DEVICE_TYPE, STATUS_SERVICE_TYPE);

-	}

-	

-	public void undoSubscribe(){

-		subscriber.unsubscribeAll();

-	}

-	

-	ArrayList LinkedDevices = new ArrayList();

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPEventListener#notifyUPnPEvent(java.lang.String, java.lang.String, java.util.Dictionary)

-	 */

-	public void notifyUPnPEvent(String deviceId, String serviceId, Dictionary events) {

-		if( !LinkedDevices.contains(deviceId))

-			LinkedDevices.add(deviceId);

-		if (deviceId.indexOf("Clock") != -1){

-				Long time = (Long) events.get("Time");

-				clockTime = new Date(time.longValue()).toString();				

-		}

-		else if (deviceId.indexOf("AirCon") != -1)

-				airconTemp = (String) events.get("Temp");

-		else if (deviceId.indexOf("Washer") != -1)

-				message = (String) events.get("State");

-		else if (deviceId.indexOf("Light") != -1)

-				message = (String) events.get("Power");

- 

-		comp.repaint();

-	}

-

-

-	////////////////////////////////////////////////

-	//	start/stop

-	////////////////////////////////////////////////

-	

-	public void start()

-	{

-		on();

-	}

-

-	public void stop()

-	{

-		((PowerStateVariable) powerService.getStateVariable("Power")).setNotifier(null);

-		notifier.destroy();

-		off();

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)

-	 */

-	public void serviceChanged(ServiceEvent event) {

-		switch(event.getType()){

-			case ServiceEvent.REGISTERED:{

-			};break;

-			

-			case ServiceEvent.MODIFIED:{				

-			};break;

-			

-			case ServiceEvent.UNREGISTERING:{	

-				ServiceReference sr = event.getServiceReference();

-				String UDN = (String)sr.getProperty(UPnPDevice.ID);

-				if (UDN != null){

-					if (LinkedDevices.contains(UDN)) {

-						if (UDN.indexOf("Clock") != -1)

-								clockTime = "";

-						else if (UDN.indexOf("AirCon") != -1)

-								airconTemp = "";

-						else if (UDN.indexOf("Washer") != -1)

-								message = "";

-						else if (UDN.indexOf("Light") != -1)

-								message = "";

-					}

-				}

-				comp.repaint();

-		 	};break;

-		}

-	}

-

-}

-

+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.upnp.sample.tv;
+
+import java.awt.Component;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Dictionary;
+import java.util.Properties;
+import java.util.Random;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+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.UPnPIcon;
+import org.osgi.service.upnp.UPnPService;
+
+import org.apache.felix.upnp.extra.util.UPnPEventNotifier;
+import org.apache.felix.upnp.extra.util.UPnPSubscriber;
+
+public class TvDevice implements UPnPDevice,UPnPEventListener,ServiceListener  {
+	
+	final private String DEVICE_ID = "uuid:Felix-TV+" +Integer.toHexString(new Random(System.currentTimeMillis()).nextInt());
+	private final static String CLOCK_DEVICE_TYPE = "urn:schemas-upnp-org:device:clock:1";
+	private final static String TIME_SERVICE_TYPE = "urn:schemas-upnp-org:service:timer:1";
+	
+	private final static String LIGHT_DEVICE_TYPE = "urn:schemas-upnp-org:device:light:1";
+	private final static String POWER_SERVICE_TYPE = "urn:schemas-upnp-org:service:power:1";
+
+	private final static String AIRCON_DEVICE_TYPE = "urn:schemas-upnp-org:device:aircon:1";
+	private final static String TEMP_SERVICE_TYPE = "urn:schemas-upnp-org:service:temp:1";
+	
+	private final static String WASHER_DEVICE_TYPE = "urn:schemas-upnp-org:device:washer:1";
+	private final static String STATUS_SERVICE_TYPE = "urn:schemas-upnp-org:service:state:1";
+
+	private final String devicesFilter = 
+		"(&"+
+			"("+Constants.OBJECTCLASS+"="+UPnPDevice.class.getName()+"))";
+			/*"(|("+UPnPDevice.TYPE+"="+ CLOCK_SERVICE_TYPE+")"+
+				"("+UPnPDevice.TYPE+"="+ LIGHT_SERVICE_TYPE+")"+
+				"("+UPnPDevice.TYPE+"="+ AIRCON_SERVICE_TYPE+")"+
+				"("+UPnPDevice.TYPE+"="+ WASHER_SERVICE_TYPE+")))";*/
+
+	private BundleContext context;
+	private PowerService powerService;
+	private UPnPService[] services;
+	private Dictionary dictionary;
+	private UPnPEventNotifier notifier;
+	private PowerStateVariable powerState;
+
+	public TvDevice() {
+		powerService = new PowerService();
+		services = new UPnPService[]{powerService};
+		powerState = (PowerStateVariable) powerService.getStateVariable("Power");
+		setupDeviceProperties();
+		buildEventNotifyer();
+		try {
+			Activator.context.addServiceListener(this,devicesFilter);
+		} catch (InvalidSyntaxException e) {
+			System.out.println(e);		
+		}
+	}
+
+	/**
+	 * 
+	 */
+	private void buildEventNotifyer() {
+		notifier = new UPnPEventNotifier(Activator.context,this,powerService);
+		powerState.setNotifier(notifier);
+	}
+
+	private void setupDeviceProperties(){
+		dictionary = new Properties();
+		dictionary.put(UPnPDevice.UPNP_EXPORT,"");
+		//org.osgi.service.device.Constants.DEVICE_CATEGORY
+		//dictionary.put("DEVICE_CATEGORY","UPnP");
+		dictionary.put(
+	        org.osgi.service
+	        	.device.Constants.DEVICE_CATEGORY,
+        	new String[]{UPnPDevice.DEVICE_CATEGORY}
+        );
+		dictionary.put(UPnPDevice.FRIENDLY_NAME,"Felix Sample Tv");
+		dictionary.put(UPnPDevice.MANUFACTURER,"Apache Software Foundation");
+		dictionary.put(UPnPDevice.MANUFACTURER_URL,"http://felix.apache.org");
+		dictionary.put(UPnPDevice.MODEL_DESCRIPTION,"A CyberLink Tv device clone to test OSGi to UPnP service import");
+		dictionary.put(UPnPDevice.MODEL_NAME,"BimbiTv");
+		dictionary.put(UPnPDevice.MODEL_NUMBER,"1.0");
+		dictionary.put(UPnPDevice.MODEL_URL,"http://felix.apache.org/site/upnp-examples.html");
+		//dictionary.put(UPnPDevice.PRESENTATION_URL,"http://felix.apache.org/BimbiTv/presentation");
+		dictionary.put(UPnPDevice.SERIAL_NUMBER,"123456789");
+		dictionary.put(UPnPDevice.TYPE,"urn:schemas-upnp-org:device:tv:1");
+		dictionary.put(UPnPDevice.UDN,DEVICE_ID);
+		//dictionary.put(UPnPDevice.ID,dictionary.get(UPnPDevice.UDN));
+		dictionary.put(UPnPDevice.UPC,"1213456789");
+	}
+	
+	
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPDevice#getService(java.lang.String)
+	 */
+	public UPnPService getService(String serviceId) {
+		if  (serviceId.equals(powerService.getId())) return powerService;
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPDevice#getServices()
+	 */
+	public UPnPService[] getServices() {
+		return services;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPDevice#getIcons(java.lang.String)
+	 */
+	public UPnPIcon[] getIcons(String locale) {
+		UPnPIcon icon = new TvIcon();
+		return new UPnPIcon[]{icon} ;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPDevice#getDescriptions(java.lang.String)
+	 */
+	public Dictionary getDescriptions(String locale) {
+		return dictionary;
+	}
+
+
+
+	////////////////////////////////////////////////
+	//	Component
+	////////////////////////////////////////////////
+
+	private Component comp;
+	
+	public void setComponent(Component comp)
+	{
+		this.comp = comp;	
+	}
+	
+	public Component getComponent()
+	{
+		return comp;
+	}
+	
+	////////////////////////////////////////////////
+	//	on/off
+	////////////////////////////////////////////////
+
+	private boolean onFlag = false;
+	
+	public void on()
+	{
+		powerState.setPower(Boolean.TRUE);
+		doSubscribe();
+	}
+
+	public boolean isOn()
+	{ 
+		return powerState.getCurrentPower().booleanValue();
+	}
+	public void off()
+	{
+		powerState.setPower(Boolean.FALSE);
+		undoSubscribe();
+	}
+
+
+	////////////////////////////////////////////////
+	//	Clock
+	////////////////////////////////////////////////
+
+	private String clockTime = ""; 
+	
+	public String getClockTime()
+	{
+		return clockTime;	
+	}
+	
+	////////////////////////////////////////////////
+	//	Aircon
+	////////////////////////////////////////////////
+
+	private String airconTemp = ""; 
+	
+	public String getAirconTempture()
+	{
+		return airconTemp;	
+	}
+
+	////////////////////////////////////////////////
+	//	Message
+	////////////////////////////////////////////////
+
+	private String message = ""; 
+	
+	public void setMessage(String msg)
+	{
+		message = msg;
+	}
+	
+	public String getMessage()
+	{
+		return message;
+	}
+	
+
+	////////////////////////////////////////////////
+	//	Subscribe
+	////////////////////////////////////////////////
+	
+	private UPnPSubscriber subscriber;
+	
+	public void doSubscribe()
+	{
+		subscriber = new UPnPSubscriber(Activator.context,this);
+		subscriber.subscribeEveryServiceType(CLOCK_DEVICE_TYPE, TIME_SERVICE_TYPE);
+		subscriber.subscribeEveryServiceType(AIRCON_DEVICE_TYPE, TEMP_SERVICE_TYPE);
+		subscriber.subscribeEveryServiceType(LIGHT_DEVICE_TYPE, POWER_SERVICE_TYPE);
+		subscriber.subscribeEveryServiceType(WASHER_DEVICE_TYPE, STATUS_SERVICE_TYPE);
+	}
+	
+	public void undoSubscribe(){
+		subscriber.unsubscribeAll();
+	}
+	
+	ArrayList LinkedDevices = new ArrayList();
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPEventListener#notifyUPnPEvent(java.lang.String, java.lang.String, java.util.Dictionary)
+	 */
+	public void notifyUPnPEvent(String deviceId, String serviceId, Dictionary events) {
+		if( !LinkedDevices.contains(deviceId))
+			LinkedDevices.add(deviceId);
+		if (deviceId.indexOf("Clock") != -1){
+				Long time = (Long) events.get("Time");
+				clockTime = new Date(time.longValue()).toString();				
+		}
+		else if (deviceId.indexOf("AirCon") != -1)
+				airconTemp = (String) events.get("Temp");
+		else if (deviceId.indexOf("Washer") != -1)
+				message = (String) events.get("State");
+		else if (deviceId.indexOf("Light") != -1)
+				message = (String) events.get("Power");
+ 
+		comp.repaint();
+	}
+
+
+	////////////////////////////////////////////////
+	//	start/stop
+	////////////////////////////////////////////////
+	
+	public void start()
+	{
+		on();
+	}
+
+	public void stop()
+	{
+		((PowerStateVariable) powerService.getStateVariable("Power")).setNotifier(null);
+		notifier.destroy();
+		off();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
+	 */
+	public void serviceChanged(ServiceEvent event) {
+		switch(event.getType()){
+			case ServiceEvent.REGISTERED:{
+			};break;
+			
+			case ServiceEvent.MODIFIED:{				
+			};break;
+			
+			case ServiceEvent.UNREGISTERING:{	
+				ServiceReference sr = event.getServiceReference();
+				String UDN = (String)sr.getProperty(UPnPDevice.ID);
+				if (UDN != null){
+					if (LinkedDevices.contains(UDN)) {
+						if (UDN.indexOf("Clock") != -1)
+								clockTime = "";
+						else if (UDN.indexOf("AirCon") != -1)
+								airconTemp = "";
+						else if (UDN.indexOf("Washer") != -1)
+								message = "";
+						else if (UDN.indexOf("Light") != -1)
+								message = "";
+					}
+				}
+				comp.repaint();
+		 	};break;
+		}
+	}
+
+}
+
diff --git a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvFrame.java b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvFrame.java
index 1bafddc..0d50cbf 100644
--- a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvFrame.java
+++ b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvFrame.java
@@ -1,123 +1,123 @@
-/* 

- * Licensed to the Apache Software Foundation (ASF) under one

- * or more contributor license agreements.  See the NOTICE file

- * distributed with this work for additional information

- * regarding copyright ownership.  The ASF licenses this file

- * to you under the Apache License, Version 2.0 (the

- * "License"); you may not use this file except in compliance

- * with the License.  You may obtain a copy of the License at

- *

- *   http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing,

- * software distributed under the License is distributed on an

- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

- * KIND, either express or implied.  See the License for the

- * specific language governing permissions and limitations

- * under the License.

- */

-

-package org.apache.felix.upnp.sample.tv;

-

-import java.awt.BorderLayout;

-import java.awt.event.WindowAdapter;

-import java.awt.event.WindowEvent;

-import java.net.URL;

-

-import javax.swing.ImageIcon;

-import javax.swing.JFrame;

-

-import org.osgi.framework.BundleException;

-

-public class TvFrame extends JFrame implements Runnable 

-{

-	private final static String TITLE = "Felix UpnP TV";

-	

-	private TvDevice tvDev;

-	private TvPane tvPane;

-	

-	public TvFrame()

-	{

-		super(TITLE);

-

-		tvDev = new TvDevice();

-

-		getContentPane().setLayout(new BorderLayout());

-

-		tvPane = new TvPane();

-		tvDev.setComponent(tvPane);

-		tvPane.setDevice(tvDev);

-		getContentPane().add(tvPane, BorderLayout.CENTER);

-

-		addWindowListener(new WindowAdapter(){

-			public void windowClosing(WindowEvent e) 

-			{

-				try {

-					Activator.context.getBundle().stop();

-				} catch (BundleException ex) {

-					ex.printStackTrace();

-				}

-			}

-		});			

-		

-	       try {

-	            URL eventIconUrl = TvFrame.class.getResource("images/logo.gif");           

-	            ImageIcon icon=  new ImageIcon(eventIconUrl,"logo");

-	            setIconImage(icon.getImage());

-	       }

-	        catch (Exception ex){

-	                System.out.println("Resource: IMAGES/logo.gif not found : " + ex.toString());

-	        }

-	        

-		pack();

-		setVisible(true);

-	}

-

-	public TvPane getTvPanel()

-	{

-		return tvPane;

-	}

-

-	public TvDevice getTvDevice()

-	{

-		return tvDev;

-	}

-		

-	////////////////////////////////////////////////

-	//	run	

-	////////////////////////////////////////////////

-

-	private Thread timerThread = null;

-		

-	public void run()

-	{

-		Thread thisThread = Thread.currentThread();

-

-		while (timerThread == thisThread) {

-			tvDev.setMessage("");

-			tvPane.repaint();

-			try {

-				Thread.sleep(1000*5);

-			}

-			catch(InterruptedException e) {}

-		}

-	}

-	

-	public void start()

-	{

-		tvDev.start();

-		

-		timerThread = new Thread(this,"upnp.sample.tv.TVFrame");

-		timerThread.start();

-	}

-	

-	public void stop()

-	{

-		tvDev.stop();

-		timerThread = null;

-		dispose();

-	}

-

-

-}

-

+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.upnp.sample.tv;
+
+import java.awt.BorderLayout;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.net.URL;
+
+import javax.swing.ImageIcon;
+import javax.swing.JFrame;
+
+import org.osgi.framework.BundleException;
+
+public class TvFrame extends JFrame implements Runnable 
+{
+	private final static String TITLE = "Felix UpnP TV";
+	
+	private TvDevice tvDev;
+	private TvPane tvPane;
+	
+	public TvFrame()
+	{
+		super(TITLE);
+
+		tvDev = new TvDevice();
+
+		getContentPane().setLayout(new BorderLayout());
+
+		tvPane = new TvPane();
+		tvDev.setComponent(tvPane);
+		tvPane.setDevice(tvDev);
+		getContentPane().add(tvPane, BorderLayout.CENTER);
+
+		addWindowListener(new WindowAdapter(){
+			public void windowClosing(WindowEvent e) 
+			{
+				try {
+					Activator.context.getBundle().stop();
+				} catch (BundleException ex) {
+					ex.printStackTrace();
+				}
+			}
+		});			
+		
+	       try {
+	            URL eventIconUrl = TvFrame.class.getResource("images/logo.gif");           
+	            ImageIcon icon=  new ImageIcon(eventIconUrl,"logo");
+	            setIconImage(icon.getImage());
+	       }
+	        catch (Exception ex){
+	                System.out.println("Resource: IMAGES/logo.gif not found : " + ex.toString());
+	        }
+	        
+		pack();
+		setVisible(true);
+	}
+
+	public TvPane getTvPanel()
+	{
+		return tvPane;
+	}
+
+	public TvDevice getTvDevice()
+	{
+		return tvDev;
+	}
+		
+	////////////////////////////////////////////////
+	//	run	
+	////////////////////////////////////////////////
+
+	private Thread timerThread = null;
+		
+	public void run()
+	{
+		Thread thisThread = Thread.currentThread();
+
+		while (timerThread == thisThread) {
+			tvDev.setMessage("");
+			tvPane.repaint();
+			try {
+				Thread.sleep(1000*5);
+			}
+			catch(InterruptedException e) {}
+		}
+	}
+	
+	public void start()
+	{
+		tvDev.start();
+		
+		timerThread = new Thread(this,"upnp.sample.tv.TVFrame");
+		timerThread.start();
+	}
+	
+	public void stop()
+	{
+		tvDev.stop();
+		timerThread = null;
+		dispose();
+	}
+
+
+}
+
diff --git a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvIcon.java b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvIcon.java
index a6df26d..fb1dec3 100644
--- a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvIcon.java
+++ b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvIcon.java
@@ -1,69 +1,69 @@
-/* 

- * Licensed to the Apache Software Foundation (ASF) under one

- * or more contributor license agreements.  See the NOTICE file

- * distributed with this work for additional information

- * regarding copyright ownership.  The ASF licenses this file

- * to you under the Apache License, Version 2.0 (the

- * "License"); you may not use this file except in compliance

- * with the License.  You may obtain a copy of the License at

- *

- *   http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing,

- * software distributed under the License is distributed on an

- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

- * KIND, either express or implied.  See the License for the

- * specific language governing permissions and limitations

- * under the License.

- */

-

-package org.apache.felix.upnp.sample.tv;

-import java.io.IOException;

-import java.io.InputStream;

-

-import org.osgi.service.upnp.UPnPIcon;

-

-public class TvIcon implements UPnPIcon {

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPIcon#getMimeType()

-	 */

-	public String getMimeType() {

-		return "image/gif";

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPIcon#getWidth()

-	 */

-	public int getWidth() {

-		return 32;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPIcon#getHeight()

-	 */

-	public int getHeight() {

-		return 32;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPIcon#getSize()

-	 */

-	public int getSize() {

-		return 0;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPIcon#getDepth()

-	 */

-	public int getDepth() {

-		return 16;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.osgi.service.upnp.UPnPIcon#getInputStream()

-	 */

-	public InputStream getInputStream() throws IOException {

-		return TvIcon.class.getResourceAsStream("images/tv.gif");

-	}

-}

+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.upnp.sample.tv;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.osgi.service.upnp.UPnPIcon;
+
+public class TvIcon implements UPnPIcon {
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPIcon#getMimeType()
+	 */
+	public String getMimeType() {
+		return "image/gif";
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPIcon#getWidth()
+	 */
+	public int getWidth() {
+		return 32;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPIcon#getHeight()
+	 */
+	public int getHeight() {
+		return 32;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPIcon#getSize()
+	 */
+	public int getSize() {
+		return 0;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPIcon#getDepth()
+	 */
+	public int getDepth() {
+		return 16;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.osgi.service.upnp.UPnPIcon#getInputStream()
+	 */
+	public InputStream getInputStream() throws IOException {
+		return TvIcon.class.getResourceAsStream("images/tv.gif");
+	}
+}
diff --git a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvPane.java b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvPane.java
index f8a0549..7dd1da4 100644
--- a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvPane.java
+++ b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/TvPane.java
@@ -1,214 +1,214 @@
-/* 

- * Licensed to the Apache Software Foundation (ASF) under one

- * or more contributor license agreements.  See the NOTICE file

- * distributed with this work for additional information

- * regarding copyright ownership.  The ASF licenses this file

- * to you under the Apache License, Version 2.0 (the

- * "License"); you may not use this file except in compliance

- * with the License.  You may obtain a copy of the License at

- *

- *   http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing,

- * software distributed under the License is distributed on an

- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

- * KIND, either express or implied.  See the License for the

- * specific language governing permissions and limitations

- * under the License.

- */

-

-package org.apache.felix.upnp.sample.tv;

-

-import java.awt.Color;

-import java.awt.Dimension;

-import java.awt.Font;

-import java.awt.FontMetrics;

-import java.awt.Graphics;

-import java.awt.geom.Rectangle2D;

-import java.awt.image.BufferedImage;

-

-import javax.imageio.ImageIO;

-import javax.swing.JPanel;

-

-public class TvPane extends JPanel  // MouseListener

-{

-	private final static int IMAGE_BORDER_SIZE = 20;

-	private final static int IMAGE_BOTTOM_BORDER_SIZE = 30;

-	

-	////////////////////////////////////////////////

-	//	Constructor

-	////////////////////////////////////////////////

-

-	public TvPane()

-	{

-		loadImage();

-		initPanel();

-	}

-

-	////////////////////////////////////////////////

-	//	TvDevice

-	////////////////////////////////////////////////

-

-	private TvDevice tvDev = null;

-	

-	public void setDevice(TvDevice dev)

-	{

-		tvDev = dev;

-	}

-

-	public TvDevice getDevice()

-	{

-		return tvDev;

-	}

-	

-	////////////////////////////////////////////////

-	//	Background

-	////////////////////////////////////////////////

-

-	private BufferedImage panelmage;

-	private BufferedImage tvOnImage;

-	

-	private void loadImage()

-	{

-		try {

-			panelmage = ImageIO.read(TvPane.class.getResourceAsStream("images/tv.jpg"));

-			tvOnImage = ImageIO.read(TvPane.class.getResourceAsStream("images/tvon.jpg"));

-		}

-		catch (Exception e) {

-			System.out.println(e);

-		}

-	}

-

-	////////////////////////////////////////////////

-	//	Background

-	////////////////////////////////////////////////

-

-	private void initPanel()

-	{

-		setPreferredSize(new Dimension(panelmage.getWidth(), panelmage.getHeight()));

-	}

-

-	////////////////////////////////////////////////

-	//	Font

-	////////////////////////////////////////////////

-

-	private final static String DEFAULT_FONT_NAME = "Lucida Console";

-	private final static int DEFAULT_TIME_FONT_SIZE = 10;

-

-	private Font timeFont = null;

-

-	private Font getFont(Graphics g, int size)

-	{

-		Font font = new Font(DEFAULT_FONT_NAME, Font.BOLD, size);

-		if (font != null)

-			return font;

-		return g.getFont();

-	}

-		

-	private Font getFont(Graphics g)

-	{

-		if (timeFont == null)

-			timeFont = getFont(g, DEFAULT_TIME_FONT_SIZE);

-		return timeFont;

-	}

-

-	////////////////////////////////////////////////

-	//	paint

-	////////////////////////////////////////////////

-

-	private void drawClockInfo(Graphics g)

-	{

-		TvDevice tvDev = getDevice();

-

-		int winWidth = getWidth();

-		int winHeight = getHeight();

-		

-		Font font = getFont(g);

-		g.setFont(font);

-		FontMetrics fontMetric = g.getFontMetrics();

-		g.setColor(Color.RED);

-

-		Rectangle2D strBounds;

-		int strWidth;

-		int strHeight;

-		int strX;

-		int strY;

-		

-		//// Time String ////

-		

-		String timeStr = tvDev.getClockTime();

-		if (timeStr != null && 0 < timeStr.length()) {

-			strBounds = fontMetric.getStringBounds(timeStr, g);

-			strWidth = (int)strBounds.getWidth();		

-			strHeight = (int)strBounds.getHeight();

-			strX = IMAGE_BORDER_SIZE;

-			strY = IMAGE_BORDER_SIZE + strHeight;

-			g.drawString(

-				timeStr,

-				strX,

-				strY);

-		}

-		

-		//// Tempture String ////

-		

-		String tempStr = tvDev.getAirconTempture();

-		if (tempStr != null && 0 < tempStr.length()) {

-			tempStr += "C";

-			strBounds = fontMetric.getStringBounds(tempStr, g);

-			strWidth = (int)strBounds.getWidth();		

-			strHeight = (int)strBounds.getHeight();

-			strX = winWidth - IMAGE_BORDER_SIZE - strWidth;

-			strY = IMAGE_BORDER_SIZE + strHeight;

-			g.drawString(

-				tempStr,

-				strX,

-				strY);

-		}

-

-		//// Message String ////

-		

-		String msgStr = tvDev.getMessage();

-		if (msgStr != null && 0 < msgStr.length()) {

-			strBounds = fontMetric.getStringBounds(msgStr, g);

-			strWidth = (int)strBounds.getWidth();		

-			strHeight = (int)strBounds.getHeight();

-			strX = IMAGE_BORDER_SIZE;

-			strY = getHeight()-IMAGE_BOTTOM_BORDER_SIZE-2;

-			g.drawString(

-				msgStr,

-				strX,

-				strY);

-		}

-	}

-

-	private void drawTvImage(Graphics g)

-	{

-		//g.setColor(Color.WHITE);

-		//g.clearRect(IMAGE_BORDER_SIZE, IMAGE_BORDER_SIZE, getWidth()-IMAGE_BORDER_SIZE*2, getHeight()-IMAGE_BORDER_SIZE-IMAGE_BOTTOM_BORDER_SIZE);

-		g.drawImage(tvOnImage, IMAGE_BORDER_SIZE, IMAGE_BORDER_SIZE, null);

-	}

-	

-	private void clear(Graphics g)

-	{

-		g.setColor(Color.GRAY);

-		g.clearRect(0, 0, getWidth(), getHeight());

-	}

-	

-

-	private void drawPanelImage(Graphics g)

-	{

-		g.drawImage(panelmage, 0, 0, null);

-	}

-		

-	public void paint(Graphics g)

-	{

-		clear(g);

-		drawPanelImage(g);

-		TvDevice tvDev = getDevice();

-		if (tvDev.isOn() == true) {

-			drawTvImage(g);

-			drawClockInfo(g);

-		}

-	}

-}

-

+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.upnp.sample.tv;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+
+import javax.imageio.ImageIO;
+import javax.swing.JPanel;
+
+public class TvPane extends JPanel  // MouseListener
+{
+	private final static int IMAGE_BORDER_SIZE = 20;
+	private final static int IMAGE_BOTTOM_BORDER_SIZE = 30;
+	
+	////////////////////////////////////////////////
+	//	Constructor
+	////////////////////////////////////////////////
+
+	public TvPane()
+	{
+		loadImage();
+		initPanel();
+	}
+
+	////////////////////////////////////////////////
+	//	TvDevice
+	////////////////////////////////////////////////
+
+	private TvDevice tvDev = null;
+	
+	public void setDevice(TvDevice dev)
+	{
+		tvDev = dev;
+	}
+
+	public TvDevice getDevice()
+	{
+		return tvDev;
+	}
+	
+	////////////////////////////////////////////////
+	//	Background
+	////////////////////////////////////////////////
+
+	private BufferedImage panelmage;
+	private BufferedImage tvOnImage;
+	
+	private void loadImage()
+	{
+		try {
+			panelmage = ImageIO.read(TvPane.class.getResourceAsStream("images/tv.jpg"));
+			tvOnImage = ImageIO.read(TvPane.class.getResourceAsStream("images/tvon.jpg"));
+		}
+		catch (Exception e) {
+			System.out.println(e);
+		}
+	}
+
+	////////////////////////////////////////////////
+	//	Background
+	////////////////////////////////////////////////
+
+	private void initPanel()
+	{
+		setPreferredSize(new Dimension(panelmage.getWidth(), panelmage.getHeight()));
+	}
+
+	////////////////////////////////////////////////
+	//	Font
+	////////////////////////////////////////////////
+
+	private final static String DEFAULT_FONT_NAME = "Lucida Console";
+	private final static int DEFAULT_TIME_FONT_SIZE = 10;
+
+	private Font timeFont = null;
+
+	private Font getFont(Graphics g, int size)
+	{
+		Font font = new Font(DEFAULT_FONT_NAME, Font.BOLD, size);
+		if (font != null)
+			return font;
+		return g.getFont();
+	}
+		
+	private Font getFont(Graphics g)
+	{
+		if (timeFont == null)
+			timeFont = getFont(g, DEFAULT_TIME_FONT_SIZE);
+		return timeFont;
+	}
+
+	////////////////////////////////////////////////
+	//	paint
+	////////////////////////////////////////////////
+
+	private void drawClockInfo(Graphics g)
+	{
+		TvDevice tvDev = getDevice();
+
+		int winWidth = getWidth();
+		int winHeight = getHeight();
+		
+		Font font = getFont(g);
+		g.setFont(font);
+		FontMetrics fontMetric = g.getFontMetrics();
+		g.setColor(Color.RED);
+
+		Rectangle2D strBounds;
+		int strWidth;
+		int strHeight;
+		int strX;
+		int strY;
+		
+		//// Time String ////
+		
+		String timeStr = tvDev.getClockTime();
+		if (timeStr != null && 0 < timeStr.length()) {
+			strBounds = fontMetric.getStringBounds(timeStr, g);
+			strWidth = (int)strBounds.getWidth();		
+			strHeight = (int)strBounds.getHeight();
+			strX = IMAGE_BORDER_SIZE;
+			strY = IMAGE_BORDER_SIZE + strHeight;
+			g.drawString(
+				timeStr,
+				strX,
+				strY);
+		}
+		
+		//// Tempture String ////
+		
+		String tempStr = tvDev.getAirconTempture();
+		if (tempStr != null && 0 < tempStr.length()) {
+			tempStr += "C";
+			strBounds = fontMetric.getStringBounds(tempStr, g);
+			strWidth = (int)strBounds.getWidth();		
+			strHeight = (int)strBounds.getHeight();
+			strX = winWidth - IMAGE_BORDER_SIZE - strWidth;
+			strY = IMAGE_BORDER_SIZE + strHeight;
+			g.drawString(
+				tempStr,
+				strX,
+				strY);
+		}
+
+		//// Message String ////
+		
+		String msgStr = tvDev.getMessage();
+		if (msgStr != null && 0 < msgStr.length()) {
+			strBounds = fontMetric.getStringBounds(msgStr, g);
+			strWidth = (int)strBounds.getWidth();		
+			strHeight = (int)strBounds.getHeight();
+			strX = IMAGE_BORDER_SIZE;
+			strY = getHeight()-IMAGE_BOTTOM_BORDER_SIZE-2;
+			g.drawString(
+				msgStr,
+				strX,
+				strY);
+		}
+	}
+
+	private void drawTvImage(Graphics g)
+	{
+		//g.setColor(Color.WHITE);
+		//g.clearRect(IMAGE_BORDER_SIZE, IMAGE_BORDER_SIZE, getWidth()-IMAGE_BORDER_SIZE*2, getHeight()-IMAGE_BORDER_SIZE-IMAGE_BOTTOM_BORDER_SIZE);
+		g.drawImage(tvOnImage, IMAGE_BORDER_SIZE, IMAGE_BORDER_SIZE, null);
+	}
+	
+	private void clear(Graphics g)
+	{
+		g.setColor(Color.GRAY);
+		g.clearRect(0, 0, getWidth(), getHeight());
+	}
+	
+
+	private void drawPanelImage(Graphics g)
+	{
+		g.drawImage(panelmage, 0, 0, null);
+	}
+		
+	public void paint(Graphics g)
+	{
+		clear(g);
+		drawPanelImage(g);
+		TvDevice tvDev = getDevice();
+		if (tvDev.isOn() == true) {
+			drawTvImage(g);
+			drawClockInfo(g);
+		}
+	}
+}
+
diff --git a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/UPnPSubscriber.java b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/UPnPSubscriber.java
index 8780f90..8d1341d 100644
--- a/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/UPnPSubscriber.java
+++ b/upnp/samples/tv/src/main/java/org/apache/felix/upnp/sample/tv/UPnPSubscriber.java
@@ -1,63 +1,63 @@
-/* 

- * Licensed to the Apache Software Foundation (ASF) under one

- * or more contributor license agreements.  See the NOTICE file

- * distributed with this work for additional information

- * regarding copyright ownership.  The ASF licenses this file

- * to you under the Apache License, Version 2.0 (the

- * "License"); you may not use this file except in compliance

- * with the License.  You may obtain a copy of the License at

- *

- *   http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing,

- * software distributed under the License is distributed on an

- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

- * KIND, either express or implied.  See the License for the

- * specific language governing permissions and limitations

- * under the License.

- */

-

-package org.apache.felix.upnp.sample.tv;

-

-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;

-

-/* 

-* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>

-*/

-

-public class UPnPSubscriber {

-	ServiceRegistration registration = null;

-	BundleContext context;

-	UPnPEventListener listener;

-	

-	public UPnPSubscriber(BundleContext context,UPnPEventListener listener){

-		this.context = context;

-		this.listener = listener;

-	}

-	

-	public void subscribe(String deviceType, String serviceType){

-		String keys = "(&(" + UPnPDevice.TYPE + "="+ deviceType + ")(" + UPnPService.TYPE + "=" + serviceType + "))";

-		try {

-			Filter filter = context.createFilter(keys);

-			Properties props = new Properties();

-			props.put(UPnPEventListener.UPNP_FILTER, filter);

-			registration = context.registerService(UPnPEventListener.class.getName(), listener, props);

-		}catch (Exception ex){

-			System.out.println(ex);

-		}

-	}

-	

-	public void unsubscribe(){

-		registration.unregister();

-		registration = null;

-	}

-	

-

-}

+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.upnp.sample.tv;
+
+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;
+
+/* 
+* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+*/
+
+public class UPnPSubscriber {
+	ServiceRegistration registration = null;
+	BundleContext context;
+	UPnPEventListener listener;
+	
+	public UPnPSubscriber(BundleContext context,UPnPEventListener listener){
+		this.context = context;
+		this.listener = listener;
+	}
+	
+	public void subscribe(String deviceType, String serviceType){
+		String keys = "(&(" + UPnPDevice.TYPE + "="+ deviceType + ")(" + UPnPService.TYPE + "=" + serviceType + "))";
+		try {
+			Filter filter = context.createFilter(keys);
+			Properties props = new Properties();
+			props.put(UPnPEventListener.UPNP_FILTER, filter);
+			registration = context.registerService(UPnPEventListener.class.getName(), listener, props);
+		}catch (Exception ex){
+			System.out.println(ex);
+		}
+	}
+	
+	public void unsubscribe(){
+		registration.unregister();
+		registration = null;
+	}
+	
+
+}