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;
442e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick    friend class MetricsSummarizer;
452ab3c43f0a73a534f79903e86284f5cabe3f5831Ray Essick    friend class MediaMetricsDeathNotifier;
46e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
47e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    public:
48e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
49e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            enum Type {
50e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                kTypeNone = 0,
51e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                kTypeInt32 = 1,
52e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                kTypeInt64 = 2,
53e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                kTypeDouble = 3,
54e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                kTypeCString = 4,
55e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                kTypeRate = 5,
56e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            };
57e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
58e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // sessionid
59e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // unique within device, within boot,
60e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        typedef int64_t SessionID_t;
61e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static constexpr SessionID_t SessionIDInvalid = -1;
62e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static constexpr SessionID_t SessionIDNone = 0;
63e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
64e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // Key: the record descriminator
65e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // values for the record discriminator
66e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // values can be "component/component"
67e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // basic values: "video", "audio", "drm"
68e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // XXX: need to better define the format
69e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        typedef AString Key;
70e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static const Key kKeyNone;              // ""
71e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static const Key kKeyAny;               // "*"
72e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
73e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // Attr: names for attributes within a record
74e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // format "prop1" or "prop/subprop"
75e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // XXX: need to better define the format
76e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        typedef const char *Attr;
77e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
78e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
79f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick        enum {
80f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick            PROTO_V0 = 0,
81f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick            PROTO_FIRST = PROTO_V0,
82f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick            PROTO_V1 = 1,
83f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick            PROTO_LAST = PROTO_V1,
84f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick        };
85f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick
86f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick
87e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    public:
88e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
89e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // access functions for the class
90e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem();
91e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem(Key);
92e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        ~MediaAnalyticsItem();
93e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
94e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // so clients can send intermediate values to be overlaid later
95e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem &setFinalized(bool);
96e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool getFinalized() const;
97e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
98e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // SessionID ties multiple submissions for same key together
99e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // so that if video "height" and "width" are known at one point
100e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // and "framerate" is only known later, they can be be brought
101e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // together.
102e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem &setSessionID(SessionID_t);
103e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem &clearSessionID();
104e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        SessionID_t getSessionID() const;
105e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // generates and stores a new ID iff mSessionID == SessionIDNone
106e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        SessionID_t generateSessionID();
107e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
108e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // reset all contents, discarding any extra data
109e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void clear();
110e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem *dup();
111e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
112e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // set the key discriminator for the record.
113e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // most often initialized as part of the constructor
114e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem &setKey(MediaAnalyticsItem::Key);
115e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem::Key getKey();
116e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
117e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // # of attributes in the record
118e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        int32_t count() const;
119e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
120e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // set values appropriately
121e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void setInt32(Attr, int32_t value);
122e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void setInt64(Attr, int64_t value);
123e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void setDouble(Attr, double value);
124e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void setRate(Attr, int64_t count, int64_t duration);
125e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void setCString(Attr, const char *value);
126e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
127e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // fused get/add/set; if attr wasn't there, it's a simple set.
128e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // type-mismatch counts as "wasn't there".
129e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void addInt32(Attr, int32_t value);
130e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void addInt64(Attr, int64_t value);
131e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void addDouble(Attr, double value);
132e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void addRate(Attr, int64_t count, int64_t duration);
133e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
134e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // find & extract values
135e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // return indicates whether attr exists (and thus value filled in)
136e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // NULL parameter value suppresses storage of value.
137e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool getInt32(Attr, int32_t *value);
138e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool getInt64(Attr, int64_t *value);
139e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool getDouble(Attr, double *value);
140e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool getRate(Attr, int64_t *count, int64_t *duration, double *rate);
141e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // Caller owns the returned string
142e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool getCString(Attr, char **value);
143e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
144e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // parameter indicates whether to close any existing open
145e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // record with same key before establishing a new record
146e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // caller retains ownership of 'this'.
147e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool selfrecord(bool);
148e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool selfrecord();
149e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
150e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // remove indicated attributes and their values
151e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // filterNot() could also be called keepOnly()
152e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // return value is # attributes removed
153e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // XXX: perhaps 'remove' instead of 'filter'
154e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // XXX: filterNot would become 'keep'
155e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        int32_t filter(int count, Attr attrs[]);
156e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        int32_t filterNot(int count, Attr attrs[]);
157e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        int32_t filter(Attr attr);
158e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
159e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // below here are used on server side or to talk to server
160e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // clients need not worry about these.
161e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
162e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // timestamp, pid, and uid only used on server side
163e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // timestamp is in 'nanoseconds, unix time'
164e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem &setTimestamp(nsecs_t);
165e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        nsecs_t getTimestamp() const;
166e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
167e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem &setPid(pid_t);
168e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        pid_t getPid() const;
169e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
170e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        MediaAnalyticsItem &setUid(uid_t);
171e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        uid_t getUid() const;
172e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
173f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick        MediaAnalyticsItem &setPkgName(AString);
174f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick        AString getPkgName() const;
175f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick
176f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick        MediaAnalyticsItem &setPkgVersionCode(int32_t);
177f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick        int32_t getPkgVersionCode() const;
178f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick
179e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // our serialization code for binder calls
180e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        int32_t writeToParcel(Parcel *);
181e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        int32_t readFromParcel(const Parcel&);
182e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
183e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        AString toString();
184f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick        AString toString(int version);
185e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
186e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // are we collecting analytics data
187e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static bool isEnabled();
188e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
189e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    protected:
190e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
191e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // merge fields from arg into this
192e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // with rules for first/last/add, etc
193e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // XXX: document semantics and how they are indicated
194e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // caller continues to own 'incoming'
195e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool merge(MediaAnalyticsItem *incoming);
196e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
197e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // enabled 1, disabled 0
198e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static const char * const EnabledProperty;
199e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static const char * const EnabledPropertyPersist;
200e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static const int   EnabledProperty_default;
201e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
202e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    private:
203e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
204e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // to help validate that A doesn't mess with B's records
205e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        pid_t     mPid;
206e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        uid_t     mUid;
207f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick        AString   mPkgName;
208f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick        int32_t   mPkgVersionCode;
209e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
210e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // let's reuse a binder connection
211e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static sp<IMediaAnalyticsService> sAnalyticsService;
212e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        static sp<IMediaAnalyticsService> getInstance();
2132ab3c43f0a73a534f79903e86284f5cabe3f5831Ray Essick        static void dropInstance();
214e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
215e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // tracking information
216e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        SessionID_t mSessionID;         // grouping similar records
217e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        nsecs_t mTimestamp;             // ns, system_time_monotonic
218e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
219e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        // will this record accept further updates
220e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        bool mFinalized;
221e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
222e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        Key mKey;
223e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
224e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        struct Prop {
225e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
226e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            Type mType;
227e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            const char *mName;
228e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            size_t mNameLen;    // the strlen(), doesn't include the null
229e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            union {
230e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                    int32_t int32Value;
231e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                    int64_t int64Value;
232e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                    double doubleValue;
233e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                    char *CStringValue;
234e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman                    struct { int64_t count, duration; } rate;
235e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            } u;
236e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            void setName(const char *name, size_t len);
237e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        };
238e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
239e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void initProp(Prop *item);
240e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void clearProp(Prop *item);
241e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void clearPropValue(Prop *item);
242e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void copyProp(Prop *dst, const Prop *src);
243e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        enum {
244e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            kGrowProps = 10
245e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        };
246e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        void growProps(int increment = kGrowProps);
247e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        size_t findPropIndex(const char *name, size_t len);
248e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        Prop *findProp(const char *name);
249e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        Prop *allocateProp(const char *name);
250f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick        bool removeProp(const char *name);
251e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
252e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        size_t mPropCount;
253e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        size_t mPropSize;
254e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        Prop *mProps;
255e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman};
256e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
257e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} // namespace android
258e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
259e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#endif
260