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