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