1/*
2 * Copyright (C) 2007-2008 Esmertec AG.
3 * Copyright (C) 2007-2008 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package com.android.mms.dom.smil;
19
20import com.android.mms.dom.events.EventImpl;
21import org.w3c.dom.DOMException;
22import org.w3c.dom.events.DocumentEvent;
23import org.w3c.dom.events.Event;
24import org.w3c.dom.smil.ElementTime;
25import org.w3c.dom.smil.SMILMediaElement;
26import org.w3c.dom.smil.TimeList;
27
28import android.util.Log;
29
30public class SmilMediaElementImpl extends SmilElementImpl implements
31        SMILMediaElement {
32    public final static String SMIL_MEDIA_START_EVENT = "SmilMediaStart";
33    public final static String SMIL_MEDIA_END_EVENT = "SmilMediaEnd";
34    public final static String SMIL_MEDIA_PAUSE_EVENT = "SmilMediaPause";
35    public final static String SMIL_MEDIA_SEEK_EVENT = "SmilMediaSeek";
36    private final static String TAG = "Mms:smil";
37    private static final boolean DEBUG = false;
38    private static final boolean LOCAL_LOGV = false;
39
40    ElementTime mElementTime = new ElementTimeImpl(this) {
41            private Event createEvent(String eventType) {
42                DocumentEvent doc =
43                    (DocumentEvent)SmilMediaElementImpl.this.getOwnerDocument();
44                Event event = doc.createEvent("Event");
45                event.initEvent(eventType, false, false);
46                if (LOCAL_LOGV) {
47                    Log.v(TAG, "Dispatching 'begin' event to "
48                            + SmilMediaElementImpl.this.getTagName() + " "
49                            + SmilMediaElementImpl.this.getSrc() + " at "
50                            + System.currentTimeMillis());
51                }
52                return event;
53            }
54
55            private Event createEvent(String eventType, int seekTo) {
56                DocumentEvent doc =
57                    (DocumentEvent)SmilMediaElementImpl.this.getOwnerDocument();
58                EventImpl event = (EventImpl) doc.createEvent("Event");
59                event.initEvent(eventType, false, false, seekTo);
60                if (LOCAL_LOGV) {
61                    Log.v(TAG, "Dispatching 'begin' event to "
62                            + SmilMediaElementImpl.this.getTagName() + " "
63                            + SmilMediaElementImpl.this.getSrc() + " at "
64                            + System.currentTimeMillis());
65                }
66                return event;
67            }
68
69            public boolean beginElement() {
70                Event startEvent = createEvent(SMIL_MEDIA_START_EVENT);
71                dispatchEvent(startEvent);
72                return true;
73            }
74
75            public boolean endElement() {
76                Event endEvent = createEvent(SMIL_MEDIA_END_EVENT);
77                dispatchEvent(endEvent);
78                return true;
79            }
80
81            public void resumeElement() {
82                Event resumeEvent = createEvent(SMIL_MEDIA_START_EVENT);
83                dispatchEvent(resumeEvent);
84            }
85
86            public void pauseElement() {
87                Event pauseEvent = createEvent(SMIL_MEDIA_PAUSE_EVENT);
88                dispatchEvent(pauseEvent);
89            }
90
91            public void seekElement(float seekTo) {
92                Event seekEvent = createEvent(SMIL_MEDIA_SEEK_EVENT, (int) seekTo);
93                dispatchEvent(seekEvent);
94            }
95
96            @Override
97            public float getDur() {
98                float dur = super.getDur();
99                if (dur == 0) {
100                    // Duration is not specified, So get the implicit duration.
101                    String tag = getTagName();
102                    if (tag.equals("video") || tag.equals("audio")) {
103                        // Continuous media
104                        // FIXME Should get the duration of the media. "indefinite" instead here.
105                        dur = -1.0F;
106                    } else if (tag.equals("text") || tag.equals("img")) {
107                        // Discrete media
108                        dur = 0;
109                    } else {
110                        Log.w(TAG, "Unknown media type");
111                    }
112                }
113                return dur;
114            }
115
116            @Override
117            ElementTime getParentElementTime() {
118                return ((SmilParElementImpl) mSmilElement.getParentNode()).mParTimeContainer;
119            }
120    };
121
122    /*
123     * Internal Interface
124     */
125
126    SmilMediaElementImpl(SmilDocumentImpl owner, String tagName) {
127        super(owner, tagName);
128    }
129
130    /*
131     * SMILMediaElement Interface
132     */
133
134    public String getAbstractAttr() {
135        return this.getAttribute("abstract");
136    }
137
138    public String getAlt() {
139        return this.getAttribute("alt");
140    }
141
142    public String getAuthor() {
143        return this.getAttribute("author");
144    }
145
146    public String getClipBegin() {
147        return this.getAttribute("clipBegin");
148    }
149
150    public String getClipEnd() {
151        return this.getAttribute("clipEnd");
152    }
153
154    public String getCopyright() {
155        return this.getAttribute("copyright");
156    }
157
158    public String getLongdesc() {
159        return this.getAttribute("longdesc");
160    }
161
162    public String getPort() {
163        return this.getAttribute("port");
164    }
165
166    public String getReadIndex() {
167        return this.getAttribute("readIndex");
168    }
169
170    public String getRtpformat() {
171        return this.getAttribute("rtpformat");
172    }
173
174    public String getSrc() {
175        return this.getAttribute("src");
176    }
177
178    public String getStripRepeat() {
179        return this.getAttribute("stripRepeat");
180    }
181
182    public String getTitle() {
183        return this.getAttribute("title");
184    }
185
186    public String getTransport() {
187        return this.getAttribute("transport");
188    }
189
190    public String getType() {
191        return this.getAttribute("type");
192    }
193
194    public void setAbstractAttr(String abstractAttr) throws DOMException {
195        this.setAttribute("abstract", abstractAttr);
196    }
197
198    public void setAlt(String alt) throws DOMException {
199        this.setAttribute("alt", alt);
200    }
201
202    public void setAuthor(String author) throws DOMException {
203        this.setAttribute("author", author);
204    }
205
206    public void setClipBegin(String clipBegin) throws DOMException {
207        this.setAttribute("clipBegin", clipBegin);
208    }
209
210    public void setClipEnd(String clipEnd) throws DOMException {
211        this.setAttribute("clipEnd", clipEnd);
212    }
213
214    public void setCopyright(String copyright) throws DOMException {
215        this.setAttribute("copyright", copyright);
216    }
217
218    public void setLongdesc(String longdesc) throws DOMException {
219        this.setAttribute("longdesc", longdesc);
220
221    }
222
223    public void setPort(String port) throws DOMException {
224        this.setAttribute("port", port);
225    }
226
227    public void setReadIndex(String readIndex) throws DOMException {
228        this.setAttribute("readIndex", readIndex);
229    }
230
231    public void setRtpformat(String rtpformat) throws DOMException {
232        this.setAttribute("rtpformat", rtpformat);
233    }
234
235    public void setSrc(String src) throws DOMException {
236        this.setAttribute("src", src);
237    }
238
239    public void setStripRepeat(String stripRepeat) throws DOMException {
240        this.setAttribute("stripRepeat", stripRepeat);
241    }
242
243    public void setTitle(String title) throws DOMException {
244        this.setAttribute("title", title);
245    }
246
247    public void setTransport(String transport) throws DOMException {
248        this.setAttribute("transport", transport);
249    }
250
251    public void setType(String type) throws DOMException {
252        this.setAttribute("type", type);
253    }
254
255    /*
256     * TimeElement Interface
257     */
258
259    public boolean beginElement() {
260        return mElementTime.beginElement();
261    }
262
263    public boolean endElement() {
264        return mElementTime.endElement();
265    }
266
267    public TimeList getBegin() {
268        return mElementTime.getBegin();
269    }
270
271    public float getDur() {
272        return mElementTime.getDur();
273    }
274
275    public TimeList getEnd() {
276        return mElementTime.getEnd();
277    }
278
279    public short getFill() {
280        return mElementTime.getFill();
281    }
282
283    public short getFillDefault() {
284        return mElementTime.getFillDefault();
285    }
286
287    public float getRepeatCount() {
288        return mElementTime.getRepeatCount();
289    }
290
291    public float getRepeatDur() {
292        return mElementTime.getRepeatDur();
293    }
294
295    public short getRestart() {
296        return mElementTime.getRestart();
297    }
298
299    public void pauseElement() {
300        mElementTime.pauseElement();
301    }
302
303    public void resumeElement() {
304        mElementTime.resumeElement();
305    }
306
307    public void seekElement(float seekTo) {
308        mElementTime.seekElement(seekTo);
309    }
310
311    public void setBegin(TimeList begin) throws DOMException {
312        mElementTime.setBegin(begin);
313    }
314
315    public void setDur(float dur) throws DOMException {
316        mElementTime.setDur(dur);
317    }
318
319    public void setEnd(TimeList end) throws DOMException {
320        mElementTime.setEnd(end);
321    }
322
323    public void setFill(short fill) throws DOMException {
324        mElementTime.setFill(fill);
325    }
326
327    public void setFillDefault(short fillDefault) throws DOMException {
328        mElementTime.setFillDefault(fillDefault);
329    }
330
331    public void setRepeatCount(float repeatCount) throws DOMException {
332        mElementTime.setRepeatCount(repeatCount);
333    }
334
335    public void setRepeatDur(float repeatDur) throws DOMException {
336        mElementTime.setRepeatDur(repeatDur);
337    }
338
339    public void setRestart(short restart) throws DOMException {
340        mElementTime.setRestart(restart);
341    }
342}
343