1f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar/* 2f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar * Copyright 2014 The Android Open Source Project 3f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar * 4f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar * Licensed under the Apache License, Version 2.0 (the "License"); 5f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar * you may not use this file except in compliance with the License. 6f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar * You may obtain a copy of the License at 7f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar * 8f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar * http://www.apache.org/licenses/LICENSE-2.0 9f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar * 10f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar * Unless required by applicable law or agreed to in writing, software 11f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar * distributed under the License is distributed on an "AS IS" BASIS, 12f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar * See the License for the specific language governing permissions and 14f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar * limitations under the License. 15f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar */ 16f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 17f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <errno.h> 18f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <stdlib.h> 19f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <ctype.h> 20f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 21f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define LOG_TAG "ADebug" 22f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <utils/Log.h> 23f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <utils/misc.h> 24f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 25f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <cutils/properties.h> 26f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 27f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <ADebug.h> 28f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <AStringUtils.h> 29f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <AUtils.h> 30f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 31f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarnamespace android { 32f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 33f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar//static 34f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos MolnarADebug::Level ADebug::GetDebugLevelFromString( 35f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const char *name, const char *value, ADebug::Level def) { 36f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // split on , 37f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const char *next = value, *current; 38f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const unsigned long maxLevel = (unsigned long)kDebugMax; 39f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar while (next != NULL) { 40f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar current = next; 41f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar next = strchr(current, ','); 42f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (next != NULL) { 43f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ++next; // pass , 44f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 45f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 46f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar while (isspace(*current)) { 47f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ++current; 48f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 49f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // check for : 50f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar char *colon = strchr(current, ':'); 51f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 52f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // get level 53f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar char *end; 54f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar errno = 0; // strtoul does not clear errno, but it can be set for any return value 55f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar unsigned long level = strtoul(current, &end, 10); 56f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar while (isspace(*end)) { 57f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ++end; 58f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 59f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (errno != 0 || end == current || (end != colon && *end != '\0' && end != next)) { 60f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // invalid level - skip 61f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar continue; 62f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 63f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (colon != NULL) { 64f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // check if pattern matches 65f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar do { // skip colon and spaces 66f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ++colon; 67f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } while (isspace(*colon)); 68f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar size_t globLen = (next == NULL ? strlen(colon) : (next - 1 - colon)); 69f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar while (globLen > 0 && isspace(colon[globLen - 1])) { 70f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar --globLen; // trim glob 71f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 72f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 73f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (!AStringUtils::MatchesGlob( 74f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar colon, globLen, name, strlen(name), true /* ignoreCase */)) { 75f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar continue; 76f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 77f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 78f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 79f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // update debug level 80f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar def = (Level)min(level, maxLevel); 81f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 82f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return def; 83f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 84f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 85f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar//static 86f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos MolnarADebug::Level ADebug::GetDebugLevelFromProperty( 87f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const char *name, const char *propertyName, ADebug::Level def) { 88f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar char value[PROPERTY_VALUE_MAX]; 89f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (property_get(propertyName, value, NULL)) { 90f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return GetDebugLevelFromString(name, value, def); 91f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 92f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return def; 93f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 94f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 95f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar//static 96f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarchar *ADebug::GetDebugName(const char *name) { 97f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar char *debugName = strdup(name); 98f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const char *terms[] = { "omx", "video", "audio" }; 99f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar for (size_t i = 0; i < NELEM(terms) && debugName != NULL; i++) { 100f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const char *term = terms[i]; 101f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const size_t len = strlen(term); 102f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar char *match = strcasestr(debugName, term); 103f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (match != NULL && (match == debugName || match[-1] == '.' 104f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar || match[len] == '.' || match[len] == '\0')) { 105f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar char *src = match + len; 106f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (match == debugName || match[-1] == '.') { 107f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar src += (*src == '.'); // remove trailing or double . 108f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 109f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar memmove(match, src, debugName + strlen(debugName) - src + 1); 110f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 111f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 112f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 113f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return debugName; 114f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 115f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 116f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} // namespace android 117f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 118