blob: daeb99f942803129b2787d56c18b4c92909ee7ee [file] [log] [blame]
// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GESTURES_PROP_REGISTRY_H__
#define GESTURES_PROP_REGISTRY_H__
#include <set>
#include <string>
#include <json/value.h>
#include "gestures/include/gestures.h"
#include "gestures/include/logging.h"
namespace gestures {
class ActivityLog;
class Property;
class PropRegistry {
public:
PropRegistry() : prop_provider_(NULL), activity_log_(NULL) {}
void Register(Property* prop);
void Unregister(Property* prop);
void SetPropProvider(GesturesPropProvider* prop_provider, void* data);
GesturesPropProvider* PropProvider() const { return prop_provider_; }
void* PropProviderData() const { return prop_provider_data_; }
const std::set<Property*>& props() const { return props_; }
void set_activity_log(ActivityLog* activity_log) {
activity_log_ = activity_log;
}
ActivityLog* activity_log() const { return activity_log_; }
private:
GesturesPropProvider* prop_provider_;
void* prop_provider_data_;
std::set<Property*> props_;
ActivityLog* activity_log_;
};
class PropertyDelegate;
class Property {
public:
Property(PropRegistry* parent, const char* name)
: gprop_(NULL), parent_(parent), delegate_(NULL), name_(name) {}
Property(PropRegistry* parent, const char* name, PropertyDelegate* delegate)
: gprop_(NULL), parent_(parent), delegate_(delegate), name_(name) {}
virtual ~Property() {
if (parent_)
parent_->Unregister(this);
}
void CreateProp();
virtual void CreatePropImpl() = 0;
void DestroyProp();
const char* name() { return name_; }
// Returns a newly allocated Value object
virtual Json::Value NewValue() const = 0;
// Returns true on success
virtual bool SetValue(const Json::Value& value) = 0;
static GesturesPropBool StaticHandleGesturesPropWillRead(void* data) {
GesturesPropBool ret =
reinterpret_cast<Property*>(data)->HandleGesturesPropWillRead();
return ret;
}
// TODO(adlr): pass on will-read notifications
virtual GesturesPropBool HandleGesturesPropWillRead() { return 0; }
static void StaticHandleGesturesPropWritten(void* data) {
reinterpret_cast<Property*>(data)->HandleGesturesPropWritten();
}
virtual void HandleGesturesPropWritten() = 0;
protected:
GesturesProp* gprop_;
PropRegistry* parent_;
PropertyDelegate* delegate_;
private:
const char* name_;
};
class BoolProperty : public Property {
public:
BoolProperty(PropRegistry* reg, const char* name, GesturesPropBool val)
: Property(reg, name), val_(val) {
if (parent_)
parent_->Register(this);
}
BoolProperty(PropRegistry* reg, const char* name, GesturesPropBool val,
PropertyDelegate* delegate)
: Property(reg, name, delegate), val_(val) {
if (parent_)
parent_->Register(this);
}
virtual void CreatePropImpl();
virtual Json::Value NewValue() const;
virtual bool SetValue(const Json::Value& value);
virtual void HandleGesturesPropWritten();
GesturesPropBool val_;
};
class BoolArrayProperty : public Property {
public:
BoolArrayProperty(PropRegistry* reg, const char* name, GesturesPropBool* vals,
size_t count)
: Property(reg, name), vals_(vals), count_(count) {
if (parent_)
parent_->Register(this);
}
BoolArrayProperty(PropRegistry* reg, const char* name, GesturesPropBool* vals,
size_t count, PropertyDelegate* delegate)
: Property(reg, name, delegate), vals_(vals), count_(count) {
if (parent_)
parent_->Register(this);
}
virtual void CreatePropImpl();
virtual Json::Value NewValue() const;
virtual bool SetValue(const Json::Value& list);
virtual void HandleGesturesPropWritten();
GesturesPropBool* vals_;
size_t count_;
};
class DoubleProperty : public Property {
public:
DoubleProperty(PropRegistry* reg, const char* name, double val)
: Property(reg, name), val_(val) {
if (parent_)
parent_->Register(this);
}
DoubleProperty(PropRegistry* reg, const char* name, double val,
PropertyDelegate* delegate)
: Property(reg, name, delegate), val_(val) {
if (parent_)
parent_->Register(this);
}
virtual void CreatePropImpl();
virtual Json::Value NewValue() const;
virtual bool SetValue(const Json::Value& value);
virtual void HandleGesturesPropWritten();
double val_;
};
class DoubleArrayProperty : public Property {
public:
DoubleArrayProperty(PropRegistry* reg, const char* name, double* vals,
size_t count)
: Property(reg, name), vals_(vals), count_(count) {
if (parent_)
parent_->Register(this);
}
DoubleArrayProperty(PropRegistry* reg, const char* name, double* vals,
size_t count, PropertyDelegate* delegate)
: Property(reg, name, delegate), vals_(vals), count_(count) {
if (parent_)
parent_->Register(this);
}
virtual void CreatePropImpl();
virtual Json::Value NewValue() const;
virtual bool SetValue(const Json::Value& list);
virtual void HandleGesturesPropWritten();
double* vals_;
size_t count_;
};
class IntProperty : public Property {
public:
IntProperty(PropRegistry* reg, const char* name, int val)
: Property(reg, name), val_(val) {
if (parent_)
parent_->Register(this);
}
IntProperty(PropRegistry* reg, const char* name, int val,
PropertyDelegate* delegate)
: Property(reg, name, delegate), val_(val) {
if (parent_)
parent_->Register(this);
}
virtual void CreatePropImpl();
virtual Json::Value NewValue() const;
virtual bool SetValue(const Json::Value& value);
virtual void HandleGesturesPropWritten();
int val_;
};
class IntArrayProperty : public Property {
public:
IntArrayProperty(PropRegistry* reg, const char* name, int* vals, size_t count)
: Property(reg, name), vals_(vals), count_(count) {
if (parent_)
parent_->Register(this);
}
IntArrayProperty(PropRegistry* reg, const char* name, int* vals, size_t count,
PropertyDelegate* delegate)
: Property(reg, name, delegate), vals_(vals), count_(count) {
if (parent_)
parent_->Register(this);
}
virtual void CreatePropImpl();
virtual Json::Value NewValue() const;
virtual bool SetValue(const Json::Value& list);
virtual void HandleGesturesPropWritten();
int* vals_;
size_t count_;
};
class StringProperty : public Property {
public:
StringProperty(PropRegistry* reg, const char* name, const char* val)
: Property(reg, name), val_(val) {
if (parent_)
parent_->Register(this);
}
StringProperty(PropRegistry* reg, const char* name, const char* val,
PropertyDelegate* delegate)
: Property(reg, name, delegate), val_(val) {
if (parent_)
parent_->Register(this);
}
virtual void CreatePropImpl();
virtual Json::Value NewValue() const;
virtual bool SetValue(const Json::Value& value);
virtual void HandleGesturesPropWritten();
std::string parsed_val_;
const char* val_;
};
class PropertyDelegate {
public:
virtual void BoolWasWritten(BoolProperty* prop) {};
virtual void BoolArrayWasWritten(BoolArrayProperty* prop) {};
virtual void DoubleWasWritten(DoubleProperty* prop) {};
virtual void DoubleArrayWasWritten(DoubleArrayProperty* prop) {};
virtual void IntWasWritten(IntProperty* prop) {};
virtual void IntArrayWasWritten(IntArrayProperty* prop) {};
virtual void StringWasWritten(StringProperty* prop) {};
};
} // namespace gestures
#endif // GESTURES_PROP_REGISTRY_H__