blob: 28a05afb9aca49d76ef9eeece8cbbf2be52efad6 [file] [log] [blame]
Francesco Furfariec7e1752006-10-02 13:37:04 +00001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
Francesco Furfaric37181b2006-04-04 23:50:50 +00009 *
Francesco Furfariec7e1752006-10-02 13:37:04 +000010 * http://www.apache.org/licenses/LICENSE-2.0
Francesco Furfaric37181b2006-04-04 23:50:50 +000011 *
Francesco Furfariec7e1752006-10-02 13:37:04 +000012 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
Francesco Furfaric37181b2006-04-04 23:50:50 +000018 */
19
20package org.apache.felix.upnp.sample.tv;
21
22import java.beans.PropertyChangeEvent;
23import java.beans.PropertyChangeListener;
24import java.util.Dictionary;
25import java.util.Iterator;
26import java.util.Properties;
27import java.util.Vector;
28
29import org.osgi.framework.BundleContext;
30import org.osgi.framework.Constants;
31import org.osgi.framework.Filter;
32import org.osgi.framework.ServiceEvent;
33import org.osgi.framework.ServiceListener;
34import org.osgi.framework.ServiceReference;
35import org.osgi.service.upnp.UPnPDevice;
36import org.osgi.service.upnp.UPnPEventListener;
37import org.osgi.service.upnp.UPnPService;
38import org.osgi.service.upnp.UPnPStateVariable;
39
Francesco Furfarif2a67912006-07-17 17:08:02 +000040/*
Karl Paulsd312acc2007-06-18 20:38:33 +000041* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
Francesco Furfarif2a67912006-07-17 17:08:02 +000042*/
Francesco Furfaric37181b2006-04-04 23:50:50 +000043
44public class UPnPEventNotifier implements PropertyChangeListener,ServiceListener {
45 BundleContext context;
46 UPnPDevice device;
47 UPnPService service;
48 EventSource source;
49
50 Properties UPnPTargetListener;
51 String deviceId;
52 String serviceId;
53 Vector upnpListeners = new Vector();
54
55 public UPnPEventNotifier(BundleContext context,UPnPDevice device,UPnPService service,EventSource source){
56 this.context=context;
57 this.device=device;
58 this.service=service;
59 this.source=source;
60 this.serviceId=service.getId();
61 setupUPnPListenerHouseKeeping(device);
62 }
63
64 /**
65 * @param deviceId
66 */
67 private void setupUPnPListenerHouseKeeping(UPnPDevice device) {
68 UPnPTargetListener = new Properties();
69 Dictionary dict = device.getDescriptions(null);
70 deviceId = (String) dict.get(UPnPDevice.ID);
71 UPnPTargetListener.put(UPnPDevice.ID,deviceId);
72 UPnPTargetListener.put(UPnPService.ID,serviceId);
73 UPnPTargetListener.put(UPnPDevice.TYPE,dict.get(UPnPDevice.TYPE));
74 UPnPTargetListener.put(UPnPService.TYPE,service.getType());
75 String ANY_UPnPEventListener = "("+Constants.OBJECTCLASS+"="+UPnPEventListener.class.getName()+")";
76
77 ServiceReference[] listeners = null;
78 try {
79 listeners = context.getServiceReferences(UPnPEventListener.class.getName(),null);
80 if (listeners != null){
81 for (int i = 0;i<listeners.length;i++){
82 ServiceReference sr = listeners[i];
83 Filter filter = (Filter) sr.getProperty(UPnPEventListener.UPNP_FILTER);
84 if (filter == null) addNewListener(sr);
85 else {
86 if (filter.match(UPnPTargetListener))
87 addNewListener(sr);
88 }
89 }
90 }
91 } catch (Exception ex) {
92 System.out.println(ex);
93 }
94
95 try {
96 //String filter = "(&" + ANY_UPnPEventListener + deviceId_Filter + ")";
97 String filter = ANY_UPnPEventListener;
98 context.addServiceListener(this,filter);
99 } catch (Exception ex) {
100 System.out.println(ex);
101 }
102
103 if (source!=null){
104 UPnPStateVariable[] vars = service.getStateVariables();
105 if (vars != null){
106 for (int i=0;i<vars.length;i++)
107 if(vars[i].sendsEvents())
108 source.addPropertyChangeListener(vars[i].getName(),this);
109 }
110 }
111
112
113 }
114
115 /* (non-Javadoc)
116 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
117 */
118 public void propertyChange(PropertyChangeEvent evt) {
119 Iterator list = upnpListeners.iterator();
120 String property = evt.getPropertyName();
121 Object value = evt.getNewValue();
122 String valueString = value.toString();
123 final Properties events = new Properties();
124 events.put(property,valueString);
125 while (list.hasNext()){
126 final ServiceReference sr = (ServiceReference)list.next();
127 String[] props =sr.getPropertyKeys();
128 new Thread(null,null,"Notifier"){
129 public void run(){
130 try {
131 UPnPEventListener listener = (UPnPEventListener) context.getService(sr);
132 listener.notifyUPnPEvent(deviceId,serviceId,events);
133 context.ungetService(sr);
134 } catch (Exception ex){
135 System.out.println("TV UPnPEventNotifier Err: " +ex);
136 System.out.println("context: " +context);
137 System.out.println("listener: " +context.getService(sr));
138 System.out.println("sr: " +sr);
139 }
140 }
141 }.start();
142 }
143 }
144
145 /* (non-Javadoc)
146 * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
147 */
148 public void serviceChanged(ServiceEvent e) {
149 switch(e.getType()){
150 case ServiceEvent.REGISTERED:{
151 ServiceReference sr = e.getServiceReference();
152 Filter filter = (Filter) sr.getProperty(UPnPEventListener.UPNP_FILTER);
153 if (filter == null) addNewListener(sr);
154 else {
155 if (filter.match(UPnPTargetListener))
156 addNewListener(sr);
157 }
158 };break;
159
160 case ServiceEvent.MODIFIED:{
Francesco Furfarid6f86a02006-06-23 12:15:54 +0000161 ServiceReference sr = e.getServiceReference();
162 Filter filter = (Filter) sr.getProperty(UPnPEventListener.UPNP_FILTER);
163 removeListener(sr);
164 if (filter == null)
165 addNewListener(sr);
166 else {
167 if (filter.match(UPnPTargetListener))
168 addNewListener(sr);
169 }
Francesco Furfaric37181b2006-04-04 23:50:50 +0000170 };break;
171
172 case ServiceEvent.UNREGISTERING:{
173 removeListener(e.getServiceReference());
174 };break;
175
176 }
177
178 }
179
180 /**
181 * @param reference
182 */
183 private void removeListener(ServiceReference reference) {
184 upnpListeners.remove(reference);
185 }
186
187 /**
188 * @param reference
189 */
190 private void addNewListener(ServiceReference reference) {
191 upnpListeners.add(reference);
192 UPnPStateVariable[] vars = service.getStateVariables();
193 if (vars != null){
194 for (int i=0;i<vars.length;i++)
195 if(vars[i].sendsEvents()){
196 Object value = ((UPnPStateVariableDescriptor) vars[i]).getValue();
197 propertyChange(new PropertyChangeEvent(this,vars[i].getName(),value,value));
198 }
199 }
200 }
201
202 public void destroy(){
203 context.removeServiceListener(this);
204 upnpListeners.removeAllElements();
205 }
206}