Parameters.cpp revision b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8d
148b68a0dc345b3208cbd9dda719b9b3ec167c8c2Bob Wilson/* 21e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall * Copyright 2012, The Android Open Source Project 35cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCall * 45cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCall * Licensed under the Apache License, Version 2.0 (the "License"); 55cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCall * you may not use this file except in compliance with the License. 65cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCall * You may obtain a copy of the License at 75cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCall * 81e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall * http://www.apache.org/licenses/LICENSE-2.0 9c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner * 10c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner * Unless required by applicable law or agreed to in writing, software 11c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner * distributed under the License is distributed on an "AS IS" BASIS, 12c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner * See the License for the specific language governing permissions and 14c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner * limitations under the License. 15c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner */ 16c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner 17c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner#include "Parameters.h" 18c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner 19c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner#include <media/stagefright/MediaErrors.h> 20c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner 21c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattnernamespace android { 22c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner 23c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattner// static 24c9a85f9b4cc8ed95ed7feeff554a74bf52bdc1f7Chris Lattnersp<Parameters> Parameters::Parse(const char *data, size_t size) { 2530fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall sp<Parameters> params = new Parameters; 2630fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall status_t err = params->parse(data, size); 2730fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall 2830fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall if (err != OK) { 2930fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall return NULL; 3030fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall } 3130fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall 3230fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall return params; 3330fa3707c440222f65fcbb78ee8677462ea0d9ceJohn McCall} 344c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 354c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCallParameters::Parameters() {} 364c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 374c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCallParameters::~Parameters() {} 384c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 394c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCallstatus_t Parameters::parse(const char *data, size_t size) { 404c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall size_t i = 0; 414c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall while (i < size) { 424c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall size_t nameStart = i; 434c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall while (i < size && data[i] != ':') { 444c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall ++i; 454c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall } 464c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 474c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall if (i == size || i == nameStart) { 484c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall return ERROR_MALFORMED; 494c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall } 504c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 514c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall AString name(&data[nameStart], i - nameStart); 524c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall name.trim(); 534c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall name.tolower(); 544c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 550691a5c83246604a89654e0dfc25870e742035b4Rafael Espindola ++i; 564c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 574c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall size_t valueStart = i; 584c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 594c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall while (i + 1 < size && (data[i] != '\r' || data[i + 1] != '\n')) { 60f48f79636d5506d15784c2c2fa8a02086adda40aJohn McCall ++i; 614c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall } 620691a5c83246604a89654e0dfc25870e742035b4Rafael Espindola 634c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall AString value(&data[valueStart], i - valueStart); 644c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall value.trim(); 654c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 664c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall mDict.add(name, value); 67f48f79636d5506d15784c2c2fa8a02086adda40aJohn McCall 684c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall i += 2; 694c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall } 704c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 714c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall return OK; 724c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall} 734c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 744c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCallbool Parameters::findParameter(const char *name, AString *value) const { 754c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall AString key = name; 764c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall key.tolower(); 774c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 784c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall ssize_t index = mDict.indexOfKey(key); 794c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 804c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall if (index < 0) { 814c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall value->clear(); 824c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 834c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall return false; 844c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall } 854c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 864c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall *value = mDict.valueAt(index); 874c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall return true; 884c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall} 894c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 904c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall} // namespace android 914c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall