/*
 *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/sdk/android/src/jni/pc/mediaconstraints_jni.h"

namespace webrtc {
namespace jni {

MediaConstraintsJni::MediaConstraintsJni(JNIEnv* jni, jobject j_constraints) {
  PopulateConstraintsFromJavaPairList(jni, j_constraints, "mandatory",
                                      &mandatory_);
  PopulateConstraintsFromJavaPairList(jni, j_constraints, "optional",
                                      &optional_);
}

// static
void MediaConstraintsJni::PopulateConstraintsFromJavaPairList(
    JNIEnv* jni,
    jobject j_constraints,
    const char* field_name,
    Constraints* field) {
  jfieldID j_id = GetFieldID(jni, GetObjectClass(jni, j_constraints),
                             field_name, "Ljava/util/List;");
  jobject j_list = GetObjectField(jni, j_constraints, j_id);
  for (jobject entry : Iterable(jni, j_list)) {
    jmethodID get_key = GetMethodID(jni, GetObjectClass(jni, entry), "getKey",
                                    "()Ljava/lang/String;");
    jstring j_key =
        reinterpret_cast<jstring>(jni->CallObjectMethod(entry, get_key));
    CHECK_EXCEPTION(jni) << "error during CallObjectMethod";
    jmethodID get_value = GetMethodID(jni, GetObjectClass(jni, entry),
                                      "getValue", "()Ljava/lang/String;");
    jstring j_value =
        reinterpret_cast<jstring>(jni->CallObjectMethod(entry, get_value));
    CHECK_EXCEPTION(jni) << "error during CallObjectMethod";
    field->push_back(
        Constraint(JavaToStdString(jni, j_key), JavaToStdString(jni, j_value)));
  }
}

}  // namespace jni
}  // namespace webrtc
