| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 //#include "DispatcherBase.h" | 5 //#include "DispatcherBase.h" |
| 6 //#include "Parser.h" | 6 //#include "Parser.h" |
| 7 | 7 |
| 8 {% for namespace in config.protocol.namespace %} | 8 {% for namespace in config.protocol.namespace %} |
| 9 namespace {{namespace}} { | 9 namespace {{namespace}} { |
| 10 {% endfor %} | 10 {% endfor %} |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 return false; | 130 return false; |
| 131 | 131 |
| 132 if (!object->getString("method", result)) | 132 if (!object->getString("method", result)) |
| 133 return false; | 133 return false; |
| 134 | 134 |
| 135 return true; | 135 return true; |
| 136 } | 136 } |
| 137 | 137 |
| 138 void DispatcherBase::sendResponse(int callId, const DispatchResponse& response,
std::unique_ptr<protocol::DictionaryValue> result) | 138 void DispatcherBase::sendResponse(int callId, const DispatchResponse& response,
std::unique_ptr<protocol::DictionaryValue> result) |
| 139 { | 139 { |
| 140 if (!m_frontendChannel) |
| 141 return; |
| 140 if (response.status() == DispatchResponse::kError) { | 142 if (response.status() == DispatchResponse::kError) { |
| 141 reportProtocolError(callId, response.errorCode(), response.errorMessage(
), nullptr); | 143 reportProtocolError(callId, response.errorCode(), response.errorMessage(
), nullptr); |
| 142 return; | 144 return; |
| 143 } | 145 } |
| 144 | 146 m_frontendChannel->sendProtocolResponse(callId, InternalResponse::createResp
onse(callId, std::move(result))); |
| 145 std::unique_ptr<protocol::DictionaryValue> responseMessage = DictionaryValue
::create(); | |
| 146 responseMessage->setInteger("id", callId); | |
| 147 responseMessage->setObject("result", std::move(result)); | |
| 148 if (m_frontendChannel) | |
| 149 m_frontendChannel->sendProtocolResponse(callId, responseMessage->toJSONS
tring()); | |
| 150 } | 147 } |
| 151 | 148 |
| 152 void DispatcherBase::sendResponse(int callId, const DispatchResponse& response) | 149 void DispatcherBase::sendResponse(int callId, const DispatchResponse& response) |
| 153 { | 150 { |
| 154 sendResponse(callId, response, DictionaryValue::create()); | 151 sendResponse(callId, response, DictionaryValue::create()); |
| 155 } | 152 } |
| 156 | 153 |
| 154 namespace { |
| 155 |
| 156 class ProtocolError : public Serializable { |
| 157 public: |
| 158 static std::unique_ptr<ProtocolError> createErrorResponse(int callId, Dispat
chResponse::ErrorCode code, const String& errorMessage, ErrorSupport* errors) |
| 159 { |
| 160 std::unique_ptr<ProtocolError> protocolError(new ProtocolError(code, err
orMessage)); |
| 161 protocolError->m_callId = callId; |
| 162 protocolError->m_hasCallId = true; |
| 163 if (errors && errors->hasErrors()) |
| 164 protocolError->m_data = errors->errors(); |
| 165 return protocolError; |
| 166 } |
| 167 |
| 168 static std::unique_ptr<ProtocolError> createErrorNotification(DispatchRespon
se::ErrorCode code, const String& errorMessage) |
| 169 { |
| 170 return std::unique_ptr<ProtocolError>(new ProtocolError(code, errorMessa
ge)); |
| 171 } |
| 172 |
| 173 String serialize() override |
| 174 { |
| 175 std::unique_ptr<protocol::DictionaryValue> error = DictionaryValue::crea
te(); |
| 176 error->setInteger("code", m_code); |
| 177 error->setString("message", m_errorMessage); |
| 178 if (m_data.length()) |
| 179 error->setString("data", m_data); |
| 180 std::unique_ptr<protocol::DictionaryValue> message = DictionaryValue::cr
eate(); |
| 181 message->setObject("error", std::move(error)); |
| 182 if (m_hasCallId) |
| 183 message->setInteger("id", m_callId); |
| 184 return message->toJSONString(); |
| 185 } |
| 186 |
| 187 ~ProtocolError() override {} |
| 188 |
| 189 private: |
| 190 ProtocolError(DispatchResponse::ErrorCode code, const String& errorMessage) |
| 191 : m_code(code) |
| 192 , m_errorMessage(errorMessage) |
| 193 { |
| 194 } |
| 195 |
| 196 DispatchResponse::ErrorCode m_code; |
| 197 String m_errorMessage; |
| 198 String m_data; |
| 199 int m_callId = 0; |
| 200 bool m_hasCallId = false; |
| 201 }; |
| 202 |
| 203 } // namespace |
| 204 |
| 157 static void reportProtocolErrorTo(FrontendChannel* frontendChannel, int callId,
DispatchResponse::ErrorCode code, const String& errorMessage, ErrorSupport* erro
rs) | 205 static void reportProtocolErrorTo(FrontendChannel* frontendChannel, int callId,
DispatchResponse::ErrorCode code, const String& errorMessage, ErrorSupport* erro
rs) |
| 158 { | 206 { |
| 159 if (!frontendChannel) | 207 if (frontendChannel) |
| 160 return; | 208 frontendChannel->sendProtocolResponse(callId, ProtocolError::createError
Response(callId, code, errorMessage, errors)); |
| 161 std::unique_ptr<protocol::DictionaryValue> error = DictionaryValue::create()
; | |
| 162 error->setInteger("code", code); | |
| 163 error->setString("message", errorMessage); | |
| 164 if (errors && errors->hasErrors()) | |
| 165 error->setString("data", errors->errors()); | |
| 166 std::unique_ptr<protocol::DictionaryValue> message = DictionaryValue::create
(); | |
| 167 message->setObject("error", std::move(error)); | |
| 168 message->setInteger("id", callId); | |
| 169 frontendChannel->sendProtocolResponse(callId, message->toJSONString()); | |
| 170 } | 209 } |
| 171 | 210 |
| 172 static void reportProtocolErrorTo(FrontendChannel* frontendChannel, DispatchResp
onse::ErrorCode code, const String& errorMessage) | 211 static void reportProtocolErrorTo(FrontendChannel* frontendChannel, DispatchResp
onse::ErrorCode code, const String& errorMessage) |
| 173 { | 212 { |
| 174 if (!frontendChannel) | 213 if (frontendChannel) |
| 175 return; | 214 frontendChannel->sendProtocolNotification(ProtocolError::createErrorNoti
fication(code, errorMessage)); |
| 176 std::unique_ptr<protocol::DictionaryValue> error = DictionaryValue::create()
; | |
| 177 error->setInteger("code", code); | |
| 178 error->setString("message", errorMessage); | |
| 179 std::unique_ptr<protocol::DictionaryValue> message = DictionaryValue::create
(); | |
| 180 message->setObject("error", std::move(error)); | |
| 181 frontendChannel->sendProtocolNotification(message->toJSONString()); | |
| 182 } | 215 } |
| 183 | 216 |
| 184 void DispatcherBase::reportProtocolError(int callId, DispatchResponse::ErrorCode
code, const String& errorMessage, ErrorSupport* errors) | 217 void DispatcherBase::reportProtocolError(int callId, DispatchResponse::ErrorCode
code, const String& errorMessage, ErrorSupport* errors) |
| 185 { | 218 { |
| 186 reportProtocolErrorTo(m_frontendChannel, callId, code, errorMessage, errors)
; | 219 reportProtocolErrorTo(m_frontendChannel, callId, code, errorMessage, errors)
; |
| 187 } | 220 } |
| 188 | 221 |
| 189 void DispatcherBase::clearFrontend() | 222 void DispatcherBase::clearFrontend() |
| 190 { | 223 { |
| 191 m_frontendChannel = nullptr; | 224 m_frontendChannel = nullptr; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 if (m_fallThroughForNotFound) | 289 if (m_fallThroughForNotFound) |
| 257 return DispatchResponse::kFallThrough; | 290 return DispatchResponse::kFallThrough; |
| 258 reportProtocolErrorTo(m_frontendChannel, callId, DispatchResponse::kMeth
odNotFound, "'" + method + "' wasn't found", nullptr); | 291 reportProtocolErrorTo(m_frontendChannel, callId, DispatchResponse::kMeth
odNotFound, "'" + method + "' wasn't found", nullptr); |
| 259 return DispatchResponse::kError; | 292 return DispatchResponse::kError; |
| 260 } | 293 } |
| 261 return it->second->dispatch(callId, method, std::move(messageObject)); | 294 return it->second->dispatch(callId, method, std::move(messageObject)); |
| 262 } | 295 } |
| 263 | 296 |
| 264 UberDispatcher::~UberDispatcher() = default; | 297 UberDispatcher::~UberDispatcher() = default; |
| 265 | 298 |
| 299 // static |
| 300 std::unique_ptr<InternalResponse> InternalResponse::createResponse(int callId, s
td::unique_ptr<Serializable> params) |
| 301 { |
| 302 return std::unique_ptr<InternalResponse>(new InternalResponse(callId, String
(), std::move(params))); |
| 303 } |
| 304 |
| 305 // static |
| 306 std::unique_ptr<InternalResponse> InternalResponse::createNotification(const Str
ing& notification, std::unique_ptr<Serializable> params) |
| 307 { |
| 308 return std::unique_ptr<InternalResponse>(new InternalResponse(0, notificatio
n, std::move(params))); |
| 309 } |
| 310 |
| 311 String InternalResponse::serialize() |
| 312 { |
| 313 std::unique_ptr<DictionaryValue> result = DictionaryValue::create(); |
| 314 std::unique_ptr<Serializable> params(m_params ? std::move(m_params) : Dictio
naryValue::create()); |
| 315 if (m_notification.length()) { |
| 316 result->setString("method", m_notification); |
| 317 result->setValue("params", SerializedValue::create(params->serialize()))
; |
| 318 } else { |
| 319 result->setInteger("id", m_callId); |
| 320 result->setValue("result", SerializedValue::create(params->serialize()))
; |
| 321 } |
| 322 return result->toJSONString(); |
| 323 } |
| 324 |
| 325 InternalResponse::InternalResponse(int callId, const String& notification, std::
unique_ptr<Serializable> params) |
| 326 : m_callId(callId) |
| 327 , m_notification(notification) |
| 328 , m_params(params ? std::move(params) : nullptr) |
| 329 { |
| 330 } |
| 331 |
| 266 {% for namespace in config.protocol.namespace %} | 332 {% for namespace in config.protocol.namespace %} |
| 267 } // namespace {{namespace}} | 333 } // namespace {{namespace}} |
| 268 {% endfor %} | 334 {% endfor %} |
| OLD | NEW |