in Source/Services/Multiplayer/multiplayer_session.cpp [2151:2287]
HRESULT XblMultiplayerSession::DeserializeSessionConstants(
_In_ const JsonValue& json
)
{
if (!json.IsObject())
{
return WEB_E_INVALID_JSON_STRING;
}
if (json.HasMember("system"))
{
const JsonValue& systemJson = json["system"];
if (systemJson.IsObject())
{
if (systemJson.HasMember("cloudComputePackage"))
{
m_constantsCloudComputePackageJson = JsonUtils::SerializeJson(systemJson["cloudComputePackage"]);
m_sessionConstants.SessionCloudComputePackageConstantsJson = m_constantsCloudComputePackageJson.data();
}
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonInt(systemJson, "maxMembersCount", m_sessionConstants.MaxMembersInSession));
xsapi_internal_string visibility;
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonString(systemJson, "visibility", visibility));
m_sessionConstants.Visibility = Serializers::MultiplayerSessionVisibilityFromString(visibility);
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonVector<uint64_t>(JsonUtils::JsonXuidExtractor, systemJson, "initiators", m_initiatorXuids, false));
m_sessionConstants.InitiatorXuids = m_initiatorXuids.data();
m_sessionConstants.InitiatorXuidsCount = m_initiatorXuids.size();
if (systemJson.HasMember("capabilities"))
{
const JsonValue& systemCapabilitiesJson = systemJson["capabilities"];
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonBool(systemCapabilitiesJson, "connectivity", m_sessionConstants.SessionCapabilities.Connectivity, false));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonBool(systemCapabilitiesJson, "suppressPresenceActivityCheck", m_sessionConstants.SessionCapabilities.SuppressPresenceActivityCheck, false));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonBool(systemCapabilitiesJson, "gameplay", m_sessionConstants.SessionCapabilities.Gameplay, false));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonBool(systemCapabilitiesJson, "large", m_sessionConstants.SessionCapabilities.Large, false));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonBool(systemCapabilitiesJson, "connectionRequiredForActiveMembers", m_sessionConstants.SessionCapabilities.ConnectionRequiredForActiveMembers, false));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonBool(systemCapabilitiesJson, "userAuthorizationStyle", m_sessionConstants.SessionCapabilities.UserAuthorizationStyle, false));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonBool(systemCapabilitiesJson, "crossPlay", m_sessionConstants.SessionCapabilities.Crossplay, false));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonBool(systemCapabilitiesJson, "hasOwners", m_sessionConstants.SessionCapabilities.HasOwners, false));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonBool(systemCapabilitiesJson, "searchable", m_sessionConstants.SessionCapabilities.Searchable, false));
}
else
{
m_sessionConstants.SessionCapabilities.Connectivity = false;
m_sessionConstants.SessionCapabilities.SuppressPresenceActivityCheck = false;
m_sessionConstants.SessionCapabilities.Gameplay = false;
m_sessionConstants.SessionCapabilities.Large = false;
m_sessionConstants.SessionCapabilities.ConnectionRequiredForActiveMembers = false;
m_sessionConstants.SessionCapabilities.UserAuthorizationStyle = false;
m_sessionConstants.SessionCapabilities.Crossplay = false;
m_sessionConstants.SessionCapabilities.HasOwners = false;
m_sessionConstants.SessionCapabilities.Searchable = false;
}
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonUInt64(systemJson, "reservedRemovalTimeout", m_sessionConstants.MemberReservedTimeout, false));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonUInt64(systemJson, "inactiveRemovalTimeout", m_sessionConstants.MemberInactiveTimeout, false));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonUInt64(systemJson, "readyRemovalTimeout", m_sessionConstants.MemberReadyTimeout, false));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonUInt64(systemJson, "sessionEmptyTimeout", m_sessionConstants.SessionEmptyTimeout, false));
if (systemJson.HasMember("metrics"))
{
const JsonValue& systemMetricsJson = systemJson["metrics"];
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonBool(systemMetricsJson, "latency", m_sessionConstants.EnableMetricsLatency, false));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonBool(systemMetricsJson, "bandwidthDown", m_sessionConstants.EnableMetricsBandwidthDown, false));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonBool(systemMetricsJson, "bandwidthUp", m_sessionConstants.EnableMetricsBandwidthUp, false));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonBool(systemMetricsJson, "custom", m_sessionConstants.EnableMetricsCustom, false));
}
else
{
m_sessionConstants.EnableMetricsLatency = false;
m_sessionConstants.EnableMetricsBandwidthDown = false;
m_sessionConstants.EnableMetricsBandwidthUp = false;
m_sessionConstants.EnableMetricsCustom = false;
}
if (systemJson.HasMember("memberInitialization"))
{
const JsonValue& memberInitializationJson = systemJson["memberInitialization"];
if (!memberInitializationJson.IsNull())
{
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonUInt64(memberInitializationJson, "joinTimeout", m_memberInitialization.JoinTimeout));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonUInt64(memberInitializationJson, "measurementTimeout", m_memberInitialization.MeasurementTimeout));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonUInt64(memberInitializationJson, "evaluationTimeout", m_memberInitialization.EvaluationTimeout));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonBool(memberInitializationJson, "externalEvaluation", m_memberInitialization.ExternalEvaluation));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonInt(memberInitializationJson, "membersNeededToStart", m_memberInitialization.MembersNeededToStart));
m_sessionConstants.MemberInitialization = &m_memberInitialization;
}
}
if (systemJson.HasMember("peerToHostRequirements"))
{
const JsonValue& peerToHostRequirementsJson = systemJson["peerToHostRequirements"];
if (!peerToHostRequirementsJson.IsNull())
{
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonUInt64(peerToHostRequirementsJson, "latencyMaximum", m_sessionConstants.PeerToHostRequirements.LatencyMaximum));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonInt(peerToHostRequirementsJson, "bandwidthDownMinimum", m_sessionConstants.PeerToHostRequirements.BandwidthDownMinimumInKbps));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonInt(peerToHostRequirementsJson, "bandwidthUpMinimum", m_sessionConstants.PeerToHostRequirements.BandwidthUpMinimumInKbps));
xsapi_internal_string hostSelectionMetric;
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonString(json, "hostSelectionMetric", hostSelectionMetric));
m_sessionConstants.PeerToHostRequirements.HostSelectionMetric = XblMultiplayerSession::ConvertStringToMultiplayerHostSelectionMetric(hostSelectionMetric);
}
}
if (systemJson.HasMember("peerToPeerRequirements"))
{
const JsonValue& peerToPeerRequirementsJson = systemJson["peerToPeerRequirements"];
if (!peerToPeerRequirementsJson.IsNull())
{
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonUInt64(peerToPeerRequirementsJson, "latencyMaximum", m_sessionConstants.PeerToPeerRequirements.LatencyMaximum));
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonInt(peerToPeerRequirementsJson, "bandwidthMinimum", m_sessionConstants.PeerToPeerRequirements.BandwidthMinimumInKbps));
}
}
if (systemJson.HasMember("measurementServerAddresses"))
{
m_constantsMeasurementServerAddressesJson = JsonUtils::SerializeJson(systemJson["measurementServerAddresses"]);
m_sessionConstants.MeasurementServerAddressesJson = m_constantsMeasurementServerAddressesJson.data();
}
}
}
else
{
//required
return WEB_E_INVALID_JSON_STRING;
}
if (json.HasMember("custom"))
{
m_constantsCustomJson = JsonUtils::SerializeJson(json["custom"]);
m_sessionConstants.CustomJson = m_constantsCustomJson.data();
}
return S_OK;
}