HRESULT XblMultiplayerSession::DeserializeSessionConstants()

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;
}