MediaStreamFrameController.h [plain text]
#ifndef MediaStreamFrameController_h
#define MediaStreamFrameController_h
#if ENABLE(MEDIA_STREAM)
#include "ExceptionCode.h"
#include "MediaStreamClient.h"
#include "NavigatorUserMediaError.h"
#include <wtf/Forward.h>
#include <wtf/HashMap.h>
#include <wtf/Noncopyable.h>
#include <wtf/text/StringHash.h>
namespace WebCore {
class Frame;
class MediaStreamController;
class NavigatorUserMediaErrorCallback;
class NavigatorUserMediaSuccessCallback;
class Page;
class ScriptExecutionContext;
class SecurityOrigin;
class MediaStreamFrameController {
WTF_MAKE_NONCOPYABLE(MediaStreamFrameController);
public:
template <typename IdType>
class ClientBase {
WTF_MAKE_NONCOPYABLE(ClientBase);
public:
ClientBase() : m_frameController(0), m_clientId(0) { }
ClientBase(MediaStreamFrameController* frameController, const IdType& id)
: m_frameController(frameController)
, m_clientId(id) { }
virtual ~ClientBase() { }
MediaStreamFrameController* mediaStreamFrameController() const { return m_frameController; }
const IdType& clientId() const { return m_clientId; }
virtual bool isStream() const { return false; }
virtual bool isGeneratedStream() const { return false; }
virtual void detachEmbedder() { }
protected:
void associateFrameController(MediaStreamFrameController* frameController, const IdType& id)
{
ASSERT(!m_frameController && !m_clientId);
m_frameController = frameController;
m_clientId = id;
}
template <typename ClientType>
void unregisterClient(ClientType* client)
{
if (!m_frameController)
return;
m_frameController->unregister(static_cast<ClientType*>(client));
m_frameController = 0;
}
virtual void unregister() = 0;
friend class MediaStreamFrameController;
MediaStreamFrameController* m_frameController;
IdType m_clientId;
};
class StreamClient : public ClientBase<String> {
public:
StreamClient(MediaStreamFrameController* frameController, const String& label) : ClientBase<String>(frameController, label) { }
virtual ~StreamClient() { unregister(); }
virtual bool isStream() const { return true; }
virtual void streamEnded() = 0;
private:
virtual void unregister() { unregisterClient(this); }
};
MediaStreamFrameController(Frame*);
virtual ~MediaStreamFrameController();
SecurityOrigin* securityOrigin() const;
ScriptExecutionContext* scriptExecutionContext() const;
bool isClientAvailable() const;
void disconnectPage();
void disconnectFrame();
void transferToNewPage(Page*);
static GenerateStreamOptionFlags parseGenerateStreamOptions(const String&);
void generateStream(const String& options, PassRefPtr<NavigatorUserMediaSuccessCallback>, PassRefPtr<NavigatorUserMediaErrorCallback>, ExceptionCode&);
void streamGenerated(int requestId, const String& streamLabel);
void streamGenerationFailed(int requestId, NavigatorUserMediaError::ErrorCode);
private:
class Request;
class GenerateStreamRequest;
class IdGenerator {
WTF_MAKE_NONCOPYABLE(IdGenerator);
public:
IdGenerator() : m_id(0) { }
int getNextId() { return ++m_id; }
private:
int m_id;
};
class RequestMap : public IdGenerator, public HashMap<int, RefPtr<Request> > {
public:
void abort(int requestId);
void abortAll();
};
template <typename IdType>
class ClientMapBase : public HashMap<IdType, ClientBase<IdType>* > {
WTF_MAKE_NONCOPYABLE(ClientMapBase);
public:
typedef HashMap<IdType, ClientBase<IdType>* > MapType;
ClientMapBase() { }
void unregisterAll();
void detachEmbedder();
};
typedef ClientMapBase<String> StreamMap;
void enterDetachedState();
void unregister(StreamClient*);
MediaStreamController* pageController() const;
RequestMap m_requests;
StreamMap m_streams;
Frame* m_frame;
bool m_isInDetachedState;
};
}
#endif // ENABLE(MEDIA_STREAM)
#endif // MediaStreamFrameController_h