android_media_Utils.cpp revision 3762c311729fe9f3af085c14c5c1fb471d994c03
179f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong/*
279f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * Copyright 2011, The Android Open Source Project
379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong *
479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * Licensed under the Apache License, Version 2.0 (the "License");
579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * you may not use this file except in compliance with the License.
679f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * You may obtain a copy of the License at
779f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong *
879f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong *     http://www.apache.org/licenses/LICENSE-2.0
979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong *
1079f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * Unless required by applicable law or agreed to in writing, software
1179f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1279f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * See the License for the specific language governing permissions and
1479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * limitations under the License.
1579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong */
1679f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
1779f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong// #define LOG_NDEBUG 0
1879f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong#define LOG_TAG "AndroidMediaUtils"
1979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
2079f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong#include <utils/Log.h>
2179f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong#include "android_media_Utils.h"
2279f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
2379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dongnamespace android {
2479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
2579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dongbool ConvertKeyValueArraysToKeyedVector(
2679f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        JNIEnv *env, jobjectArray keys, jobjectArray values,
2779f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        KeyedVector<String8, String8>* keyedVector) {
2879f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
2979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong    int nKeyValuePairs = 0;
3079f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong    bool failed = false;
3179f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong    if (keys != NULL && values != NULL) {
3279f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        nKeyValuePairs = env->GetArrayLength(keys);
3379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        failed = (nKeyValuePairs != env->GetArrayLength(values));
3479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong    }
3579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
3679f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong    if (!failed) {
3779f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        failed = ((keys != NULL && values == NULL) ||
3879f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong                  (keys == NULL && values != NULL));
3979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong    }
4079f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
4179f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong    if (failed) {
423762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("keys and values arrays have different length");
4379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
4479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        return false;
4579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong    }
4679f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
4779f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong    for (int i = 0; i < nKeyValuePairs; ++i) {
4879f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        // No need to check on the ArrayIndexOutOfBoundsException, since
4979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        // it won't happen here.
5079f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        jstring key = (jstring) env->GetObjectArrayElement(keys, i);
5179f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        jstring value = (jstring) env->GetObjectArrayElement(values, i);
5279f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
5379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        const char* keyStr = env->GetStringUTFChars(key, NULL);
5479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        if (!keyStr) {  // OutOfMemoryError
5579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong            return false;
5679f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        }
5779f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
5879f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        const char* valueStr = env->GetStringUTFChars(value, NULL);
5979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        if (!valueStr) {  // OutOfMemoryError
6079f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong            env->ReleaseStringUTFChars(key, keyStr);
6179f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong            return false;
6279f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        }
6379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
6479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        keyedVector->add(String8(keyStr), String8(valueStr));
6579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
6679f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        env->ReleaseStringUTFChars(key, keyStr);
6779f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        env->ReleaseStringUTFChars(value, valueStr);
6879f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        env->DeleteLocalRef(key);
6979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        env->DeleteLocalRef(value);
7079f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong    }
7179f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong    return true;
7279f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong}
7379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
7479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong}  // namespace android
7579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
76