1e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/*
2e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Copyright (C) 2016 The Android Open Source Project
3e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
4e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Licensed under the Apache License, Version 2.0 (the "License");
5e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * you may not use this file except in compliance with the License.
6e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * You may obtain a copy of the License at
7e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
8e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *      http://www.apache.org/licenses/LICENSE-2.0
9e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
10e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Unless required by applicable law or agreed to in writing, software
11e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * distributed under the License is distributed on an "AS IS" BASIS,
12e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * See the License for the specific language governing permissions and
14e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * limitations under the License.
15e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */
16e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
17e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#ifndef ANDROID_MEDIA_MEDIAANALYTICSITEM_H
18e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define ANDROID_MEDIA_MEDIAANALYTICSITEM_H
19e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
20e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <cutils/properties.h>
21e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <sys/types.h>
22e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/Errors.h>
23e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/KeyedVector.h>
24e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/RefBase.h>
25e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/StrongPointer.h>
26e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/Timers.h>
27e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
28e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/stagefright/foundation/AString.h>
29e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
30e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace android {
31e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
32e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
33e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
34e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass IMediaAnalyticsService;
35e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
36e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// the class interface
37e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman//
38e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
39e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass MediaAnalyticsItem {
40e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
41e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    friend class MediaAnalyticsService;
42e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    friend class IMediaAnalyticsService;
43e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    friend class MediaMetricsJNI;
44845eb1e48ddaa3af9be8dc84b4b58b24fba46e6fRay Essick    friend class MetricsSummarizer;
45e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
46e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    public:
47e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
48e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            enum Type {
49e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                kTypeNone = 0,
50e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                kTypeInt32 = 1,
51e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                kTypeInt64 = 2,
52e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                kTypeDouble = 3,
53e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                kTypeCString = 4,
54e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                kTypeRate = 5,
55e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            };
56e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
57e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // sessionid
58e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // unique within device, within boot,
59e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        typedef int64_t SessionID_t;
60e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static constexpr SessionID_t SessionIDInvalid = -1;
61e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static constexpr SessionID_t SessionIDNone = 0;
62e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
63e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // Key: the record descriminator
64e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // values for the record discriminator
65e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // values can be "component/component"
66e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // basic values: "video", "audio", "drm"
67e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // XXX: need to better define the format
68e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        typedef AString Key;
69e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static const Key kKeyNone;              // ""
70e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static const Key kKeyAny;               // "*"
71e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
72e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // Attr: names for attributes within a record
73e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // format "prop1" or "prop/subprop"
74e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // XXX: need to better define the format
75e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        typedef const char *Attr;
76e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
77e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
78e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    public:
79e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
80e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // access functions for the class
81e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem();
82e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem(Key);
83e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        ~MediaAnalyticsItem();
84e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
85e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // so clients can send intermediate values to be overlaid later
86e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem &setFinalized(bool);
87e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool getFinalized() const;
88e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
89e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // SessionID ties multiple submissions for same key together
90e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // so that if video "height" and "width" are known at one point
91e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // and "framerate" is only known later, they can be be brought
92e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // together.
93e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem &setSessionID(SessionID_t);
94e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem &clearSessionID();
95e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        SessionID_t getSessionID() const;
96e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // generates and stores a new ID iff mSessionID == SessionIDNone
97e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        SessionID_t generateSessionID();
98e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
99e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // reset all contents, discarding any extra data
100e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void clear();
101e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem *dup();
102e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
103e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // set the key discriminator for the record.
104e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // most often initialized as part of the constructor
105e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem &setKey(MediaAnalyticsItem::Key);
106e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem::Key getKey();
107e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
108e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // # of attributes in the record
109e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        int32_t count() const;
110e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
111e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // set values appropriately
112e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void setInt32(Attr, int32_t value);
113e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void setInt64(Attr, int64_t value);
114e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void setDouble(Attr, double value);
115e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void setRate(Attr, int64_t count, int64_t duration);
116e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void setCString(Attr, const char *value);
117e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
118e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // fused get/add/set; if attr wasn't there, it's a simple set.
119e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // type-mismatch counts as "wasn't there".
120e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void addInt32(Attr, int32_t value);
121e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void addInt64(Attr, int64_t value);
122e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void addDouble(Attr, double value);
123e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void addRate(Attr, int64_t count, int64_t duration);
124e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
125e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // find & extract values
126e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // return indicates whether attr exists (and thus value filled in)
127e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // NULL parameter value suppresses storage of value.
128e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool getInt32(Attr, int32_t *value);
129e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool getInt64(Attr, int64_t *value);
130e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool getDouble(Attr, double *value);
131e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool getRate(Attr, int64_t *count, int64_t *duration, double *rate);
132e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // Caller owns the returned string
133e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool getCString(Attr, char **value);
134e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
135e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // parameter indicates whether to close any existing open
136e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // record with same key before establishing a new record
137e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // caller retains ownership of 'this'.
138e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool selfrecord(bool);
139e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool selfrecord();
140e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
141e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // remove indicated attributes and their values
142e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // filterNot() could also be called keepOnly()
143e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // return value is # attributes removed
144e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // XXX: perhaps 'remove' instead of 'filter'
145e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // XXX: filterNot would become 'keep'
146e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        int32_t filter(int count, Attr attrs[]);
147e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        int32_t filterNot(int count, Attr attrs[]);
148e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        int32_t filter(Attr attr);
149e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
150e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // below here are used on server side or to talk to server
151e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // clients need not worry about these.
152e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
153e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // timestamp, pid, and uid only used on server side
154e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // timestamp is in 'nanoseconds, unix time'
155e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem &setTimestamp(nsecs_t);
156e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        nsecs_t getTimestamp() const;
157e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
158e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem &setPid(pid_t);
159e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        pid_t getPid() const;
160e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
161e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem &setUid(uid_t);
162e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        uid_t getUid() const;
163e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
164e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // our serialization code for binder calls
165e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        int32_t writeToParcel(Parcel *);
166e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        int32_t readFromParcel(const Parcel&);
167e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
168e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        AString toString();
169e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
170e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // are we collecting analytics data
171e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static bool isEnabled();
172e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
173e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    protected:
174e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
175e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // merge fields from arg into this
176e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // with rules for first/last/add, etc
177e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // XXX: document semantics and how they are indicated
178e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // caller continues to own 'incoming'
179e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool merge(MediaAnalyticsItem *incoming);
180e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
181e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // enabled 1, disabled 0
182e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static const char * const EnabledProperty;
183e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static const char * const EnabledPropertyPersist;
184e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static const int   EnabledProperty_default;
185e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
186e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    private:
187e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
188e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // to help validate that A doesn't mess with B's records
189e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        pid_t     mPid;
190e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        uid_t     mUid;
191e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
192e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // let's reuse a binder connection
193e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static sp<IMediaAnalyticsService> sAnalyticsService;
194e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static sp<IMediaAnalyticsService> getInstance();
195e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
196e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // tracking information
197e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        SessionID_t mSessionID;         // grouping similar records
198e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        nsecs_t mTimestamp;             // ns, system_time_monotonic
199e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
200e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // will this record accept further updates
201e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool mFinalized;
202e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
203e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        Key mKey;
204e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
205e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        struct Prop {
206e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
207e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            Type mType;
208e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            const char *mName;
209e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            size_t mNameLen;    // the strlen(), doesn't include the null
210e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            union {
211e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                    int32_t int32Value;
212e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                    int64_t int64Value;
213e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                    double doubleValue;
214e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                    char *CStringValue;
215e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                    struct { int64_t count, duration; } rate;
216e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            } u;
217e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            void setName(const char *name, size_t len);
218e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        };
219e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
220e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void initProp(Prop *item);
221e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void clearProp(Prop *item);
222e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void clearPropValue(Prop *item);
223e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void copyProp(Prop *dst, const Prop *src);
224e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        enum {
225e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            kGrowProps = 10
226e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        };
227e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void growProps(int increment = kGrowProps);
228e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        size_t findPropIndex(const char *name, size_t len);
229e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        Prop *findProp(const char *name);
230e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        Prop *allocateProp(const char *name);
231e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
232e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        size_t mPropCount;
233e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        size_t mPropSize;
234e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        Prop *mProps;
235e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman};
236e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
237e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} // namespace android
238e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
239e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#endif
240