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