1b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber/* 2b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber * Copyright 2012, The Android Open Source Project 3b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber * 4b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber * you may not use this file except in compliance with the License. 6b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber * You may obtain a copy of the License at 7b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber * 8b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber * 10b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber * Unless required by applicable law or agreed to in writing, software 11b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber * See the License for the specific language governing permissions and 14b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber * limitations under the License. 15b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber */ 16b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 17b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber#include "Parameters.h" 18b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 19b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber#include <media/stagefright/MediaErrors.h> 20b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 21b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Hubernamespace android { 22b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 23b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber// static 24b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Hubersp<Parameters> Parameters::Parse(const char *data, size_t size) { 25b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber sp<Parameters> params = new Parameters; 26b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber status_t err = params->parse(data, size); 27b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 28b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber if (err != OK) { 29b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber return NULL; 30b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber } 31b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 32b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber return params; 33b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber} 34b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 35b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas HuberParameters::Parameters() {} 36b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 37b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas HuberParameters::~Parameters() {} 38b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 39b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huberstatus_t Parameters::parse(const char *data, size_t size) { 40b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber size_t i = 0; 41b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber while (i < size) { 42b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber size_t nameStart = i; 43b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber while (i < size && data[i] != ':') { 44b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber ++i; 45b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber } 46b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 47b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber if (i == size || i == nameStart) { 48b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber return ERROR_MALFORMED; 49b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber } 50b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 51b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber AString name(&data[nameStart], i - nameStart); 52b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber name.trim(); 53b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber name.tolower(); 54b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 55b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber ++i; 56b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 57b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber size_t valueStart = i; 58b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 59b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber while (i + 1 < size && (data[i] != '\r' || data[i + 1] != '\n')) { 60b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber ++i; 61b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber } 62b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 63b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber AString value(&data[valueStart], i - valueStart); 64b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber value.trim(); 65b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 66b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber mDict.add(name, value); 67b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 68aef5c98cd3f67e0209e1fa28489078e9f40d6f46Chong Zhang while (i + 1 < size && data[i] == '\r' && data[i + 1] == '\n') { 69aef5c98cd3f67e0209e1fa28489078e9f40d6f46Chong Zhang i += 2; 70aef5c98cd3f67e0209e1fa28489078e9f40d6f46Chong Zhang } 71b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber } 72b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 73b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber return OK; 74b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber} 75b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 76b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huberbool Parameters::findParameter(const char *name, AString *value) const { 77b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber AString key = name; 78b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber key.tolower(); 79b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 80b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber ssize_t index = mDict.indexOfKey(key); 81b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 82b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber if (index < 0) { 83b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber value->clear(); 84b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 85b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber return false; 86b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber } 87b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 88b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber *value = mDict.valueAt(index); 89b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber return true; 90b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber} 91b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber 92b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber} // namespace android 93