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