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