Index: content/renderer/media/media_stream_dispatcher.cc |
=================================================================== |
--- content/renderer/media/media_stream_dispatcher.cc (revision 209718) |
+++ content/renderer/media/media_stream_dispatcher.cc (working copy) |
@@ -14,6 +14,11 @@ |
namespace content { |
+// A request is identified by pair (request_id, handler), or ipc_request. |
+// There could be multiple clients making requests and each has its own |
+// request_id sequence. |
+// The ipc_request is garanteed to be unique when it's created in |
+// MediaStreamDispatcher. |
struct MediaStreamDispatcher::Request { |
Request(const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler, |
int request_id, |
@@ -22,6 +27,11 @@ |
request_id(request_id), |
ipc_request(ipc_request) { |
} |
+ bool IsThisRequest( |
+ int request_id1, |
+ const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler1) { |
+ return (request_id1 == request_id && handler1.get() == handler.get()); |
+ } |
base::WeakPtr<MediaStreamDispatcherEventHandler> handler; |
int request_id; |
int ipc_request; |
@@ -44,6 +54,12 @@ |
MediaStreamDispatcher::EnumerationRequest::~EnumerationRequest() {} |
+bool MediaStreamDispatcher::EnumerationRequest::IsThisRequest( |
+ int request_id1, |
+ const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler1) { |
+ return (request_id1 == request_id && handler1.get() == handler.get()); |
+} |
+ |
MediaStreamDispatcher::EnumerationState::EnumerationState() |
: ipc_id(-1) { |
} |
@@ -85,18 +101,20 @@ |
security_origin)); |
} |
-void MediaStreamDispatcher::CancelGenerateStream(int request_id) { |
+void MediaStreamDispatcher::CancelGenerateStream( |
+ int request_id, |
+ const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) { |
DCHECK(main_loop_->BelongsToCurrentThread()); |
DVLOG(1) << "MediaStreamDispatcher::CancelGenerateStream" |
<< ", {request_id = " << request_id << "}"; |
RequestList::iterator it = requests_.begin(); |
for (; it != requests_.end(); ++it) { |
- Request& request = *it; |
- if (request.request_id == request_id) { |
+ if (it->IsThisRequest(request_id, event_handler)) { |
+ int ipc_request = it->ipc_request; |
requests_.erase(it); |
Send(new MediaStreamHostMsg_CancelGenerateStream(routing_id(), |
- request_id)); |
+ ipc_request)); |
break; |
} |
} |
@@ -164,8 +182,7 @@ |
EnumerationRequestList* requests = &state->requests; |
for (EnumerationRequestList::iterator it = requests->begin(); |
it != requests->end(); ++it) { |
- if (it->request_id == request_id && |
- it->handler.get() == event_handler.get()) { |
+ if (it->IsThisRequest(request_id, event_handler)) { |
requests->erase(it); |
if (requests->empty() && state->cached_devices) { |
// No more request and has a label, try to stop the label |
@@ -197,6 +214,12 @@ |
security_origin)); |
} |
+void MediaStreamDispatcher::CancelOpenDevice( |
+ int request_id, |
+ const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) { |
+ CancelGenerateStream(request_id, event_handler); |
+} |
+ |
void MediaStreamDispatcher::CloseDevice(const std::string& label) { |
DCHECK(main_loop_->BelongsToCurrentThread()); |
DVLOG(1) << "MediaStreamDispatcher::CloseDevice" |