#ifndef MediaStream_h
#define MediaStream_h
#if ENABLE(MEDIA_STREAM)
#include "ContextDestructionObserver.h"
#include "EventTarget.h"
#include "ExceptionBase.h"
#include "MediaStreamDescriptor.h"
#include "MediaStreamTrack.h"
#include "Timer.h"
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
namespace WebCore {
class MediaStream : public RefCounted<MediaStream>, public MediaStreamDescriptorClient, public EventTarget, public ContextDestructionObserver {
public:
static PassRefPtr<MediaStream> create(ScriptExecutionContext*);
static PassRefPtr<MediaStream> create(ScriptExecutionContext*, PassRefPtr<MediaStream>);
static PassRefPtr<MediaStream> create(ScriptExecutionContext*, const MediaStreamTrackVector&);
static PassRefPtr<MediaStream> create(ScriptExecutionContext*, PassRefPtr<MediaStreamDescriptor>);
virtual ~MediaStream();
String label() const { return m_descriptor->id(); }
String id() const { return m_descriptor->id(); }
void addTrack(PassRefPtr<MediaStreamTrack>, ExceptionCode&);
void removeTrack(PassRefPtr<MediaStreamTrack>, ExceptionCode&);
MediaStreamTrack* getTrackById(String);
MediaStreamTrackVector getAudioTracks() const { return m_audioTracks; }
MediaStreamTrackVector getVideoTracks() const { return m_videoTracks; }
bool ended() const;
DEFINE_ATTRIBUTE_EVENT_LISTENER(ended);
DEFINE_ATTRIBUTE_EVENT_LISTENER(addtrack);
DEFINE_ATTRIBUTE_EVENT_LISTENER(removetrack);
virtual void streamEnded() OVERRIDE;
virtual bool isLocal() const { return false; }
MediaStreamDescriptor* descriptor() const { return m_descriptor.get(); }
virtual const AtomicString& interfaceName() const OVERRIDE;
virtual ScriptExecutionContext* scriptExecutionContext() const OVERRIDE;
using RefCounted<MediaStream>::ref;
using RefCounted<MediaStream>::deref;
protected:
MediaStream(ScriptExecutionContext*, PassRefPtr<MediaStreamDescriptor>);
virtual EventTargetData* eventTargetData() OVERRIDE;
virtual EventTargetData* ensureEventTargetData() OVERRIDE;
virtual void contextDestroyed();
private:
virtual void refEventTarget() OVERRIDE { ref(); }
virtual void derefEventTarget() OVERRIDE { deref(); }
virtual void addRemoteTrack(MediaStreamComponent*) OVERRIDE;
virtual void removeRemoteTrack(MediaStreamComponent*) OVERRIDE;
void scheduleDispatchEvent(PassRefPtr<Event>);
void scheduledEventTimerFired(Timer<MediaStream>*);
bool m_stopped;
EventTargetData m_eventTargetData;
MediaStreamTrackVector m_audioTracks;
MediaStreamTrackVector m_videoTracks;
RefPtr<MediaStreamDescriptor> m_descriptor;
Timer<MediaStream> m_scheduledEventTimer;
Vector<RefPtr<Event> > m_scheduledEvents;
};
typedef Vector<RefPtr<MediaStream> > MediaStreamVector;
}
#endif // ENABLE(MEDIA_STREAM)
#endif // MediaStream_h