android_media_Utils.cpp revision 3762c311729fe9f3af085c14c5c1fb471d994c03
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright 2011, The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// #define LOG_NDEBUG 0
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "AndroidMediaUtils"
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "android_media_Utils.h"
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
24c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool ConvertKeyValueArraysToKeyedVector(
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        JNIEnv *env, jobjectArray keys, jobjectArray values,
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        KeyedVector<String8, String8>* keyedVector) {
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int nKeyValuePairs = 0;
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool failed = false;
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (keys != NULL && values != NULL) {
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        nKeyValuePairs = env->GetArrayLength(keys);
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        failed = (nKeyValuePairs != env->GetArrayLength(values));
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!failed) {
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        failed = ((keys != NULL && values == NULL) ||
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                  (keys == NULL && values != NULL));
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (failed) {
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ALOGE("keys and values arrays have different length");
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (int i = 0; i < nKeyValuePairs; ++i) {
4820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian        // No need to check on the ArrayIndexOutOfBoundsException, since
4920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian        // it won't happen here.
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        jstring key = (jstring) env->GetObjectArrayElement(keys, i);
5120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian        jstring value = (jstring) env->GetObjectArrayElement(values, i);
5220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const char* keyStr = env->GetStringUTFChars(key, NULL);
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!keyStr) {  // OutOfMemoryError
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return false;
560926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian        }
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const char* valueStr = env->GetStringUTFChars(value, NULL);
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!valueStr) {  // OutOfMemoryError
6020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian            env->ReleaseStringUTFChars(key, keyStr);
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return false;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        keyedVector->add(String8(keyStr), String8(valueStr));
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        env->ReleaseStringUTFChars(key, keyStr);
6720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian        env->ReleaseStringUTFChars(value, valueStr);
68bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopian        env->DeleteLocalRef(key);
69bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopian        env->DeleteLocalRef(value);
70bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopian    }
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
73bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopian
74bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopian}  // namespace android
75bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopian
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project