aboutsummaryrefslogtreecommitdiff
path: root/cast/receiver/application_agent.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cast/receiver/application_agent.cc')
-rw-r--r--cast/receiver/application_agent.cc49
1 files changed, 18 insertions, 31 deletions
diff --git a/cast/receiver/application_agent.cc b/cast/receiver/application_agent.cc
index df2b49e6..d5665391 100644
--- a/cast/receiver/application_agent.cc
+++ b/cast/receiver/application_agent.cc
@@ -11,6 +11,7 @@
#include "cast/common/public/cast_socket.h"
#include "platform/base/tls_credentials.h"
#include "platform/base/tls_listen_options.h"
+#include "util/json/json_helpers.h"
#include "util/json/json_serialization.h"
#include "util/osp_logging.h"
@@ -18,24 +19,6 @@ namespace openscreen {
namespace cast {
namespace {
-// Parses the given string as a JSON object. If the parse fails, an empty object
-// is returned.
-Json::Value ParseAsObject(absl::string_view value) {
- ErrorOr<Json::Value> parsed = json::Parse(value);
- if (parsed.is_value() && parsed.value().isObject()) {
- return std::move(parsed.value());
- }
- return Json::Value(Json::objectValue);
-}
-
-// Returns true if the type field in |object| is set to the given |type|.
-bool HasType(const Json::Value& object, CastMessageType type) {
- OSP_DCHECK(object.isObject());
- const Json::Value& value =
- object.get(kMessageKeyType, Json::Value::nullSingleton());
- return value.isString() && value.asString() == CastMessageTypeToString(type);
-}
-
// Returns the first app ID for the given |app|, or the empty string if there is
// none.
std::string GetFirstAppId(ApplicationAgent::Application* app) {
@@ -142,25 +125,29 @@ void ApplicationAgent::OnMessage(VirtualConnectionRouter* router,
return;
}
- const Json::Value request = ParseAsObject(message.payload_utf8());
+ const ErrorOr<Json::Value> request = json::Parse(message.payload_utf8());
+ if (request.is_error() || request.value().type() != Json::objectValue) {
+ return;
+ }
+
Json::Value response;
if (ns == kHeartbeatNamespace) {
- if (HasType(request, CastMessageType::kPing)) {
+ if (HasType(request.value(), CastMessageType::kPing)) {
response = HandlePing();
}
} else if (ns == kReceiverNamespace) {
- if (request[kMessageKeyRequestId].isNull()) {
- response = HandleInvalidCommand(request);
- } else if (HasType(request, CastMessageType::kGetAppAvailability)) {
- response = HandleGetAppAvailability(request);
- } else if (HasType(request, CastMessageType::kGetStatus)) {
- response = HandleGetStatus(request);
- } else if (HasType(request, CastMessageType::kLaunch)) {
- response = HandleLaunch(request, socket);
- } else if (HasType(request, CastMessageType::kStop)) {
- response = HandleStop(request);
+ if (request.value()[kMessageKeyRequestId].isNull()) {
+ response = HandleInvalidCommand(request.value());
+ } else if (HasType(request.value(), CastMessageType::kGetAppAvailability)) {
+ response = HandleGetAppAvailability(request.value());
+ } else if (HasType(request.value(), CastMessageType::kGetStatus)) {
+ response = HandleGetStatus(request.value());
+ } else if (HasType(request.value(), CastMessageType::kLaunch)) {
+ response = HandleLaunch(request.value(), socket);
+ } else if (HasType(request.value(), CastMessageType::kStop)) {
+ response = HandleStop(request.value());
} else {
- response = HandleInvalidCommand(request);
+ response = HandleInvalidCommand(request.value());
}
} else {
// Ignore messages for all other namespaces.