#ifndef MediaStream_h
#define MediaStream_h
#include "bindings/v8/ScriptWrappable.h"
#include "core/dom/ContextLifecycleObserver.h"
#include "core/events/EventTarget.h"
#include "core/html/URLRegistry.h"
#include "modules/mediastream/MediaStreamTrack.h"
#include "platform/Timer.h"
#include "platform/mediastream/MediaStreamDescriptor.h"
#include "wtf/RefCounted.h"
#include "wtf/RefPtr.h"
namespace WebCore {
class ExceptionState;
class MediaStream FINAL : public RefCounted<MediaStream>, public ScriptWrappable, public URLRegistrable, public MediaStreamDescriptorClient, public EventTargetWithInlineData, public ContextLifecycleObserver, public MediaStreamTrack::Observer {
REFCOUNTED_EVENT_TARGET(MediaStream);
public:
static PassRefPtr<MediaStream> create(ExecutionContext*);
static PassRefPtr<MediaStream> create(ExecutionContext*, PassRefPtr<MediaStream>);
static PassRefPtr<MediaStream> create(ExecutionContext*, const MediaStreamTrackVector&);
static PassRefPtr<MediaStream> create(ExecutionContext*, PassRefPtr<MediaStreamDescriptor>);
virtual ~MediaStream();
String label() const { return m_descriptor->id(); }
String id() const { return m_descriptor->id(); }
void addTrack(PassRefPtr<MediaStreamTrack>, ExceptionState&);
void removeTrack(PassRefPtr<MediaStreamTrack>, ExceptionState&);
MediaStreamTrack* getTrackById(String);
PassRefPtr<MediaStream> clone(ExecutionContext*);
MediaStreamTrackVector getAudioTracks() const { return m_audioTracks; }
MediaStreamTrackVector getVideoTracks() const { return m_videoTracks; }
bool ended() const;
void stop();
DEFINE_ATTRIBUTE_EVENT_LISTENER(ended);
DEFINE_ATTRIBUTE_EVENT_LISTENER(addtrack);
DEFINE_ATTRIBUTE_EVENT_LISTENER(removetrack);
virtual void trackEnded() OVERRIDE;
virtual void streamEnded() OVERRIDE;
MediaStreamDescriptor* descriptor() const { return m_descriptor.get(); }
virtual const AtomicString& interfaceName() const OVERRIDE;
virtual ExecutionContext* executionContext() const OVERRIDE;
virtual URLRegistry& registry() const OVERRIDE;
private:
MediaStream(ExecutionContext*, PassRefPtr<MediaStreamDescriptor>);
MediaStream(ExecutionContext*, const MediaStreamTrackVector& audioTracks, const MediaStreamTrackVector& videoTracks);
virtual void contextDestroyed() OVERRIDE;
virtual void addRemoteTrack(MediaStreamComponent*) OVERRIDE;
virtual void removeRemoteTrack(MediaStreamComponent*) OVERRIDE;
void scheduleDispatchEvent(PassRefPtrWillBeRawPtr<Event>);
void scheduledEventTimerFired(Timer<MediaStream>*);
bool m_stopped;
MediaStreamTrackVector m_audioTracks;
MediaStreamTrackVector m_videoTracks;
RefPtr<MediaStreamDescriptor> m_descriptor;
Timer<MediaStream> m_scheduledEventTimer;
WillBePersistentHeapVector<RefPtrWillBeMember<Event> > m_scheduledEvents;
};
typedef Vector<RefPtr<MediaStream> > MediaStreamVector;
}
#endif