1*aed3e508SAndroid Build Coastguard Worker // Copyright 2011 The ChromiumOS Authors 2*aed3e508SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*aed3e508SAndroid Build Coastguard Worker // found in the LICENSE file. 4*aed3e508SAndroid Build Coastguard Worker 5*aed3e508SAndroid Build Coastguard Worker #ifndef GESTURES_PROP_REGISTRY_H__ 6*aed3e508SAndroid Build Coastguard Worker #define GESTURES_PROP_REGISTRY_H__ 7*aed3e508SAndroid Build Coastguard Worker 8*aed3e508SAndroid Build Coastguard Worker #include <set> 9*aed3e508SAndroid Build Coastguard Worker #include <string> 10*aed3e508SAndroid Build Coastguard Worker 11*aed3e508SAndroid Build Coastguard Worker #include <json/value.h> 12*aed3e508SAndroid Build Coastguard Worker 13*aed3e508SAndroid Build Coastguard Worker #include "include/gestures.h" 14*aed3e508SAndroid Build Coastguard Worker #include "include/logging.h" 15*aed3e508SAndroid Build Coastguard Worker 16*aed3e508SAndroid Build Coastguard Worker namespace gestures { 17*aed3e508SAndroid Build Coastguard Worker 18*aed3e508SAndroid Build Coastguard Worker class ActivityLog; 19*aed3e508SAndroid Build Coastguard Worker class Property; 20*aed3e508SAndroid Build Coastguard Worker 21*aed3e508SAndroid Build Coastguard Worker class PropRegistry { 22*aed3e508SAndroid Build Coastguard Worker public: PropRegistry()23*aed3e508SAndroid Build Coastguard Worker PropRegistry() : prop_provider_(nullptr), activity_log_(nullptr) {} 24*aed3e508SAndroid Build Coastguard Worker 25*aed3e508SAndroid Build Coastguard Worker void Register(Property* prop); 26*aed3e508SAndroid Build Coastguard Worker void Unregister(Property* prop); 27*aed3e508SAndroid Build Coastguard Worker 28*aed3e508SAndroid Build Coastguard Worker void SetPropProvider(GesturesPropProvider* prop_provider, void* data); PropProvider()29*aed3e508SAndroid Build Coastguard Worker GesturesPropProvider* PropProvider() const { return prop_provider_; } PropProviderData()30*aed3e508SAndroid Build Coastguard Worker void* PropProviderData() const { return prop_provider_data_; } props()31*aed3e508SAndroid Build Coastguard Worker const std::set<Property*>& props() const { return props_; } 32*aed3e508SAndroid Build Coastguard Worker set_activity_log(ActivityLog * activity_log)33*aed3e508SAndroid Build Coastguard Worker void set_activity_log(ActivityLog* activity_log) { 34*aed3e508SAndroid Build Coastguard Worker activity_log_ = activity_log; 35*aed3e508SAndroid Build Coastguard Worker } activity_log()36*aed3e508SAndroid Build Coastguard Worker ActivityLog* activity_log() const { return activity_log_; } 37*aed3e508SAndroid Build Coastguard Worker 38*aed3e508SAndroid Build Coastguard Worker private: 39*aed3e508SAndroid Build Coastguard Worker GesturesPropProvider* prop_provider_; 40*aed3e508SAndroid Build Coastguard Worker void* prop_provider_data_; 41*aed3e508SAndroid Build Coastguard Worker std::set<Property*> props_; 42*aed3e508SAndroid Build Coastguard Worker ActivityLog* activity_log_; 43*aed3e508SAndroid Build Coastguard Worker }; 44*aed3e508SAndroid Build Coastguard Worker 45*aed3e508SAndroid Build Coastguard Worker class PropertyDelegate; 46*aed3e508SAndroid Build Coastguard Worker 47*aed3e508SAndroid Build Coastguard Worker class Property { 48*aed3e508SAndroid Build Coastguard Worker public: Property(PropRegistry * parent,const char * name)49*aed3e508SAndroid Build Coastguard Worker Property(PropRegistry* parent, const char* name) 50*aed3e508SAndroid Build Coastguard Worker : parent_(parent), name_(name) {} 51*aed3e508SAndroid Build Coastguard Worker ~Property()52*aed3e508SAndroid Build Coastguard Worker virtual ~Property() { 53*aed3e508SAndroid Build Coastguard Worker if (parent_) 54*aed3e508SAndroid Build Coastguard Worker parent_->Unregister(this); 55*aed3e508SAndroid Build Coastguard Worker } 56*aed3e508SAndroid Build Coastguard Worker 57*aed3e508SAndroid Build Coastguard Worker void CreateProp(); 58*aed3e508SAndroid Build Coastguard Worker virtual void CreatePropImpl() = 0; 59*aed3e508SAndroid Build Coastguard Worker void DestroyProp(); 60*aed3e508SAndroid Build Coastguard Worker SetDelegate(PropertyDelegate * delegate)61*aed3e508SAndroid Build Coastguard Worker void SetDelegate(PropertyDelegate* delegate) { 62*aed3e508SAndroid Build Coastguard Worker delegate_ = delegate; 63*aed3e508SAndroid Build Coastguard Worker } 64*aed3e508SAndroid Build Coastguard Worker name()65*aed3e508SAndroid Build Coastguard Worker const char* name() { return name_; } 66*aed3e508SAndroid Build Coastguard Worker // Returns a newly allocated Value object 67*aed3e508SAndroid Build Coastguard Worker virtual Json::Value NewValue() const = 0; 68*aed3e508SAndroid Build Coastguard Worker // Returns true on success 69*aed3e508SAndroid Build Coastguard Worker virtual bool SetValue(const Json::Value& value) = 0; 70*aed3e508SAndroid Build Coastguard Worker StaticHandleGesturesPropWillRead(void * data)71*aed3e508SAndroid Build Coastguard Worker static GesturesPropBool StaticHandleGesturesPropWillRead(void* data) { 72*aed3e508SAndroid Build Coastguard Worker GesturesPropBool ret = 73*aed3e508SAndroid Build Coastguard Worker reinterpret_cast<Property*>(data)->HandleGesturesPropWillRead(); 74*aed3e508SAndroid Build Coastguard Worker return ret; 75*aed3e508SAndroid Build Coastguard Worker } 76*aed3e508SAndroid Build Coastguard Worker // TODO(adlr): pass on will-read notifications HandleGesturesPropWillRead()77*aed3e508SAndroid Build Coastguard Worker virtual GesturesPropBool HandleGesturesPropWillRead() { return 0; } StaticHandleGesturesPropWritten(void * data)78*aed3e508SAndroid Build Coastguard Worker static void StaticHandleGesturesPropWritten(void* data) { 79*aed3e508SAndroid Build Coastguard Worker reinterpret_cast<Property*>(data)->HandleGesturesPropWritten(); 80*aed3e508SAndroid Build Coastguard Worker } 81*aed3e508SAndroid Build Coastguard Worker virtual void HandleGesturesPropWritten() = 0; 82*aed3e508SAndroid Build Coastguard Worker 83*aed3e508SAndroid Build Coastguard Worker protected: 84*aed3e508SAndroid Build Coastguard Worker GesturesProp* gprop_ = nullptr; 85*aed3e508SAndroid Build Coastguard Worker PropRegistry* parent_; 86*aed3e508SAndroid Build Coastguard Worker PropertyDelegate* delegate_ = nullptr; 87*aed3e508SAndroid Build Coastguard Worker 88*aed3e508SAndroid Build Coastguard Worker private: 89*aed3e508SAndroid Build Coastguard Worker const char* name_; 90*aed3e508SAndroid Build Coastguard Worker }; 91*aed3e508SAndroid Build Coastguard Worker 92*aed3e508SAndroid Build Coastguard Worker class BoolProperty : public Property { 93*aed3e508SAndroid Build Coastguard Worker public: BoolProperty(PropRegistry * reg,const char * name,GesturesPropBool val)94*aed3e508SAndroid Build Coastguard Worker BoolProperty(PropRegistry* reg, const char* name, GesturesPropBool val) 95*aed3e508SAndroid Build Coastguard Worker : Property(reg, name), val_(val) { 96*aed3e508SAndroid Build Coastguard Worker if (parent_) 97*aed3e508SAndroid Build Coastguard Worker parent_->Register(this); 98*aed3e508SAndroid Build Coastguard Worker } 99*aed3e508SAndroid Build Coastguard Worker virtual void CreatePropImpl(); 100*aed3e508SAndroid Build Coastguard Worker virtual Json::Value NewValue() const; 101*aed3e508SAndroid Build Coastguard Worker virtual bool SetValue(const Json::Value& value); 102*aed3e508SAndroid Build Coastguard Worker virtual void HandleGesturesPropWritten(); 103*aed3e508SAndroid Build Coastguard Worker 104*aed3e508SAndroid Build Coastguard Worker GesturesPropBool val_; 105*aed3e508SAndroid Build Coastguard Worker }; 106*aed3e508SAndroid Build Coastguard Worker 107*aed3e508SAndroid Build Coastguard Worker class BoolArrayProperty : public Property { 108*aed3e508SAndroid Build Coastguard Worker public: BoolArrayProperty(PropRegistry * reg,const char * name,GesturesPropBool * vals,size_t count)109*aed3e508SAndroid Build Coastguard Worker BoolArrayProperty(PropRegistry* reg, const char* name, GesturesPropBool* vals, 110*aed3e508SAndroid Build Coastguard Worker size_t count) 111*aed3e508SAndroid Build Coastguard Worker : Property(reg, name), vals_(vals), count_(count) { 112*aed3e508SAndroid Build Coastguard Worker if (parent_) 113*aed3e508SAndroid Build Coastguard Worker parent_->Register(this); 114*aed3e508SAndroid Build Coastguard Worker } 115*aed3e508SAndroid Build Coastguard Worker virtual void CreatePropImpl(); 116*aed3e508SAndroid Build Coastguard Worker virtual Json::Value NewValue() const; 117*aed3e508SAndroid Build Coastguard Worker virtual bool SetValue(const Json::Value& list); 118*aed3e508SAndroid Build Coastguard Worker virtual void HandleGesturesPropWritten(); 119*aed3e508SAndroid Build Coastguard Worker 120*aed3e508SAndroid Build Coastguard Worker GesturesPropBool* vals_; 121*aed3e508SAndroid Build Coastguard Worker size_t count_; 122*aed3e508SAndroid Build Coastguard Worker }; 123*aed3e508SAndroid Build Coastguard Worker 124*aed3e508SAndroid Build Coastguard Worker class DoubleProperty : public Property { 125*aed3e508SAndroid Build Coastguard Worker public: DoubleProperty(PropRegistry * reg,const char * name,double val)126*aed3e508SAndroid Build Coastguard Worker DoubleProperty(PropRegistry* reg, const char* name, double val) 127*aed3e508SAndroid Build Coastguard Worker : Property(reg, name), val_(val) { 128*aed3e508SAndroid Build Coastguard Worker if (parent_) 129*aed3e508SAndroid Build Coastguard Worker parent_->Register(this); 130*aed3e508SAndroid Build Coastguard Worker } 131*aed3e508SAndroid Build Coastguard Worker virtual void CreatePropImpl(); 132*aed3e508SAndroid Build Coastguard Worker virtual Json::Value NewValue() const; 133*aed3e508SAndroid Build Coastguard Worker virtual bool SetValue(const Json::Value& value); 134*aed3e508SAndroid Build Coastguard Worker virtual void HandleGesturesPropWritten(); 135*aed3e508SAndroid Build Coastguard Worker 136*aed3e508SAndroid Build Coastguard Worker double val_; 137*aed3e508SAndroid Build Coastguard Worker }; 138*aed3e508SAndroid Build Coastguard Worker 139*aed3e508SAndroid Build Coastguard Worker class DoubleArrayProperty : public Property { 140*aed3e508SAndroid Build Coastguard Worker public: DoubleArrayProperty(PropRegistry * reg,const char * name,double * vals,size_t count)141*aed3e508SAndroid Build Coastguard Worker DoubleArrayProperty(PropRegistry* reg, const char* name, double* vals, 142*aed3e508SAndroid Build Coastguard Worker size_t count) 143*aed3e508SAndroid Build Coastguard Worker : Property(reg, name), vals_(vals), count_(count) { 144*aed3e508SAndroid Build Coastguard Worker if (parent_) 145*aed3e508SAndroid Build Coastguard Worker parent_->Register(this); 146*aed3e508SAndroid Build Coastguard Worker } 147*aed3e508SAndroid Build Coastguard Worker virtual void CreatePropImpl(); 148*aed3e508SAndroid Build Coastguard Worker virtual Json::Value NewValue() const; 149*aed3e508SAndroid Build Coastguard Worker virtual bool SetValue(const Json::Value& list); 150*aed3e508SAndroid Build Coastguard Worker virtual void HandleGesturesPropWritten(); 151*aed3e508SAndroid Build Coastguard Worker 152*aed3e508SAndroid Build Coastguard Worker double* vals_; 153*aed3e508SAndroid Build Coastguard Worker size_t count_; 154*aed3e508SAndroid Build Coastguard Worker }; 155*aed3e508SAndroid Build Coastguard Worker 156*aed3e508SAndroid Build Coastguard Worker class IntProperty : public Property { 157*aed3e508SAndroid Build Coastguard Worker public: IntProperty(PropRegistry * reg,const char * name,int val)158*aed3e508SAndroid Build Coastguard Worker IntProperty(PropRegistry* reg, const char* name, int val) 159*aed3e508SAndroid Build Coastguard Worker : Property(reg, name), val_(val) { 160*aed3e508SAndroid Build Coastguard Worker if (parent_) 161*aed3e508SAndroid Build Coastguard Worker parent_->Register(this); 162*aed3e508SAndroid Build Coastguard Worker } 163*aed3e508SAndroid Build Coastguard Worker virtual void CreatePropImpl(); 164*aed3e508SAndroid Build Coastguard Worker virtual Json::Value NewValue() const; 165*aed3e508SAndroid Build Coastguard Worker virtual bool SetValue(const Json::Value& value); 166*aed3e508SAndroid Build Coastguard Worker virtual void HandleGesturesPropWritten(); 167*aed3e508SAndroid Build Coastguard Worker 168*aed3e508SAndroid Build Coastguard Worker int val_; 169*aed3e508SAndroid Build Coastguard Worker }; 170*aed3e508SAndroid Build Coastguard Worker 171*aed3e508SAndroid Build Coastguard Worker class IntArrayProperty : public Property { 172*aed3e508SAndroid Build Coastguard Worker public: IntArrayProperty(PropRegistry * reg,const char * name,int * vals,size_t count)173*aed3e508SAndroid Build Coastguard Worker IntArrayProperty(PropRegistry* reg, const char* name, int* vals, 174*aed3e508SAndroid Build Coastguard Worker size_t count) 175*aed3e508SAndroid Build Coastguard Worker : Property(reg, name), vals_(vals), count_(count) { 176*aed3e508SAndroid Build Coastguard Worker if (parent_) 177*aed3e508SAndroid Build Coastguard Worker parent_->Register(this); 178*aed3e508SAndroid Build Coastguard Worker } 179*aed3e508SAndroid Build Coastguard Worker virtual void CreatePropImpl(); 180*aed3e508SAndroid Build Coastguard Worker virtual Json::Value NewValue() const; 181*aed3e508SAndroid Build Coastguard Worker virtual bool SetValue(const Json::Value& list); 182*aed3e508SAndroid Build Coastguard Worker virtual void HandleGesturesPropWritten(); 183*aed3e508SAndroid Build Coastguard Worker 184*aed3e508SAndroid Build Coastguard Worker int* vals_; 185*aed3e508SAndroid Build Coastguard Worker size_t count_; 186*aed3e508SAndroid Build Coastguard Worker }; 187*aed3e508SAndroid Build Coastguard Worker 188*aed3e508SAndroid Build Coastguard Worker class StringProperty : public Property { 189*aed3e508SAndroid Build Coastguard Worker public: StringProperty(PropRegistry * reg,const char * name,const char * val)190*aed3e508SAndroid Build Coastguard Worker StringProperty(PropRegistry* reg, const char* name, const char* val) 191*aed3e508SAndroid Build Coastguard Worker : Property(reg, name), val_(val) { 192*aed3e508SAndroid Build Coastguard Worker if (parent_) 193*aed3e508SAndroid Build Coastguard Worker parent_->Register(this); 194*aed3e508SAndroid Build Coastguard Worker } 195*aed3e508SAndroid Build Coastguard Worker virtual void CreatePropImpl(); 196*aed3e508SAndroid Build Coastguard Worker virtual Json::Value NewValue() const; 197*aed3e508SAndroid Build Coastguard Worker virtual bool SetValue(const Json::Value& value); 198*aed3e508SAndroid Build Coastguard Worker virtual void HandleGesturesPropWritten(); 199*aed3e508SAndroid Build Coastguard Worker 200*aed3e508SAndroid Build Coastguard Worker std::string parsed_val_; 201*aed3e508SAndroid Build Coastguard Worker const char* val_; 202*aed3e508SAndroid Build Coastguard Worker }; 203*aed3e508SAndroid Build Coastguard Worker 204*aed3e508SAndroid Build Coastguard Worker class PropertyDelegate { 205*aed3e508SAndroid Build Coastguard Worker public: BoolWasWritten(BoolProperty * prop)206*aed3e508SAndroid Build Coastguard Worker virtual void BoolWasWritten(BoolProperty* prop) {}; BoolArrayWasWritten(BoolArrayProperty * prop)207*aed3e508SAndroid Build Coastguard Worker virtual void BoolArrayWasWritten(BoolArrayProperty* prop) {}; DoubleWasWritten(DoubleProperty * prop)208*aed3e508SAndroid Build Coastguard Worker virtual void DoubleWasWritten(DoubleProperty* prop) {}; DoubleArrayWasWritten(DoubleArrayProperty * prop)209*aed3e508SAndroid Build Coastguard Worker virtual void DoubleArrayWasWritten(DoubleArrayProperty* prop) {}; IntWasWritten(IntProperty * prop)210*aed3e508SAndroid Build Coastguard Worker virtual void IntWasWritten(IntProperty* prop) {}; IntArrayWasWritten(IntArrayProperty * prop)211*aed3e508SAndroid Build Coastguard Worker virtual void IntArrayWasWritten(IntArrayProperty* prop) {}; StringWasWritten(StringProperty * prop)212*aed3e508SAndroid Build Coastguard Worker virtual void StringWasWritten(StringProperty* prop) {}; 213*aed3e508SAndroid Build Coastguard Worker }; 214*aed3e508SAndroid Build Coastguard Worker 215*aed3e508SAndroid Build Coastguard Worker } // namespace gestures 216*aed3e508SAndroid Build Coastguard Worker 217*aed3e508SAndroid Build Coastguard Worker #endif // GESTURES_PROP_REGISTRY_H__ 218