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