1/*
2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef RTCDTMFSender_h
27#define RTCDTMFSender_h
28
29#include "core/dom/ActiveDOMObject.h"
30#include "modules/EventTargetModules.h"
31#include "platform/Timer.h"
32#include "public/platform/WebRTCDTMFSenderHandlerClient.h"
33
34namespace blink {
35
36class ExceptionState;
37class MediaStreamTrack;
38class WebRTCDTMFSenderHandler;
39class WebRTCPeerConnectionHandler;
40
41class RTCDTMFSender FINAL
42    : public RefCountedGarbageCollectedWillBeGarbageCollectedFinalized<RTCDTMFSender>
43    , public EventTargetWithInlineData
44    , public WebRTCDTMFSenderHandlerClient
45    , public ActiveDOMObject {
46    DEFINE_EVENT_TARGET_REFCOUNTING_WILL_BE_REMOVED(RefCountedGarbageCollectedWillBeGarbageCollectedFinalized<RTCDTMFSender>);
47    DEFINE_WRAPPERTYPEINFO();
48    WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(RTCDTMFSender);
49public:
50    static RTCDTMFSender* create(ExecutionContext*, WebRTCPeerConnectionHandler*, MediaStreamTrack*, ExceptionState&);
51    virtual ~RTCDTMFSender();
52
53    bool canInsertDTMF() const;
54    MediaStreamTrack* track() const;
55    String toneBuffer() const;
56    long duration() const { return m_duration; }
57    long interToneGap() const { return m_interToneGap; }
58
59    void insertDTMF(const String& tones, ExceptionState&);
60    void insertDTMF(const String& tones, long duration, ExceptionState&);
61    void insertDTMF(const String& tones, long duration, long interToneGap, ExceptionState&);
62
63    DEFINE_ATTRIBUTE_EVENT_LISTENER(tonechange);
64
65    // EventTarget
66    virtual const AtomicString& interfaceName() const OVERRIDE;
67    virtual ExecutionContext* executionContext() const OVERRIDE;
68
69    // ActiveDOMObject
70    virtual void stop() OVERRIDE;
71
72    virtual void trace(Visitor*) OVERRIDE;
73
74private:
75    RTCDTMFSender(ExecutionContext*, MediaStreamTrack*, PassOwnPtr<WebRTCDTMFSenderHandler>);
76
77    void scheduleDispatchEvent(PassRefPtrWillBeRawPtr<Event>);
78    void scheduledEventTimerFired(Timer<RTCDTMFSender>*);
79
80    // WebRTCDTMFSenderHandlerClient
81    virtual void didPlayTone(const WebString&) OVERRIDE;
82
83    Member<MediaStreamTrack> m_track;
84    long m_duration;
85    long m_interToneGap;
86
87    OwnPtr<WebRTCDTMFSenderHandler> m_handler;
88
89    bool m_stopped;
90
91    Timer<RTCDTMFSender> m_scheduledEventTimer;
92    WillBeHeapVector<RefPtrWillBeMember<Event> > m_scheduledEvents;
93};
94
95} // namespace blink
96
97#endif // RTCDTMFSender_h
98