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