1 // Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
2 // reserved. Use of this source code is governed by a BSD-style license that can
3 // be found in the LICENSE file.
4
5 #include "libcef/common/response_manager.h"
6 #include "libcef/common/cef_messages.h"
7
8 #include "base/logging.h"
9
CefResponseManager()10 CefResponseManager::CefResponseManager() : next_request_id_(0) {}
11
GetNextRequestId()12 int CefResponseManager::GetNextRequestId() {
13 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
14 return ++next_request_id_;
15 }
16
RegisterHandler(CefRefPtr<Handler> handler)17 int CefResponseManager::RegisterHandler(CefRefPtr<Handler> handler) {
18 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
19 int request_id = GetNextRequestId();
20 TRACE_EVENT_ASYNC_BEGIN1("cef", "CefResponseManager::Handler", request_id,
21 "request_id", request_id);
22 handlers_.insert(std::make_pair(request_id, handler));
23 return request_id;
24 }
25
RunHandler(const Cef_Response_Params & params)26 bool CefResponseManager::RunHandler(const Cef_Response_Params& params) {
27 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
28 DCHECK_GT(params.request_id, 0);
29 HandlerMap::iterator it = handlers_.find(params.request_id);
30 if (it != handlers_.end()) {
31 TRACE_EVENT0("cef", "CefResponseManager::RunHandler");
32 it->second->OnResponse(params);
33 handlers_.erase(it);
34 TRACE_EVENT_ASYNC_END1("cef", "CefResponseManager::Handler",
35 params.request_id, "success", 1);
36 return true;
37 }
38 TRACE_EVENT_ASYNC_END1("cef", "CefResponseManager::Handler",
39 params.request_id, "success", 0);
40 return false;
41 }
42
RegisterAckHandler(int request_id,CefRefPtr<AckHandler> handler)43 void CefResponseManager::RegisterAckHandler(int request_id,
44 CefRefPtr<AckHandler> handler) {
45 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
46 ack_handlers_.insert(std::make_pair(request_id, handler));
47 }
48
RunAckHandler(int request_id)49 bool CefResponseManager::RunAckHandler(int request_id) {
50 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
51 DCHECK_GT(request_id, 0);
52 AckHandlerMap::iterator it = ack_handlers_.find(request_id);
53 if (it != ack_handlers_.end()) {
54 it->second->OnResponseAck();
55 ack_handlers_.erase(it);
56 return true;
57 }
58 return false;
59 }
60