1bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber/*
2bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * Copyright 2012, The Android Open Source Project
3bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber *
4bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * you may not use this file except in compliance with the License.
6bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * You may obtain a copy of the License at
7bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber *
8bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber *     http://www.apache.org/licenses/LICENSE-2.0
9bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber *
10bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * Unless required by applicable law or agreed to in writing, software
11bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * See the License for the specific language governing permissions and
14bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * limitations under the License.
15bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber */
16bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
17bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber#include <media/stagefright/foundation/ABase.h>
18bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber#include <media/stagefright/foundation/AString.h>
19bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber#include <utils/KeyedVector.h>
20bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber#include <utils/RefBase.h>
21bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
22bb197f84c4119651e5face418285688ddaf08ea3Andreas Hubernamespace android {
23bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
24d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// Encapsulates an "HTTP/RTSP style" response, i.e. a status line,
25d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// key/value pairs making up the headers and an optional body/content.
26bb197f84c4119651e5face418285688ddaf08ea3Andreas Huberstruct ParsedMessage : public RefBase {
27bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    static sp<ParsedMessage> Parse(
28bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber            const char *data, size_t size, bool noMoreData, size_t *length);
29bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
30bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    bool findString(const char *name, AString *value) const;
31bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    bool findInt32(const char *name, int32_t *value) const;
32bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
33bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    const char *getContent() const;
34bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
358060060217ff16cd67c8f6a15c649f44c343acf0Andreas Huber    bool getRequestField(size_t index, AString *field) const;
36bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    bool getStatusCode(int32_t *statusCode) const;
37bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
38bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    AString debugString() const;
39bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
40bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    static bool GetAttribute(const char *s, const char *key, AString *value);
41bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
42bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    static bool GetInt32Attribute(
43bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber            const char *s, const char *key, int32_t *value);
44bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
45bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
46bb197f84c4119651e5face418285688ddaf08ea3Andreas Huberprotected:
47bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    virtual ~ParsedMessage();
48bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
49bb197f84c4119651e5face418285688ddaf08ea3Andreas Huberprivate:
50bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    KeyedVector<AString, AString> mDict;
51bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    AString mContent;
52bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
53bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    ParsedMessage();
54bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
55bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    ssize_t parse(const char *data, size_t size, bool noMoreData);
56bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
57bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ParsedMessage);
58bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber};
59bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
60bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber}  // namespace android
61