diff options
author | Emiel Bruijntjes <emiel.bruijntjes@copernica.com> | 2014-04-10 11:36:44 +0200 |
---|---|---|
committer | Emiel Bruijntjes <emiel.bruijntjes@copernica.com> | 2014-04-10 11:36:44 +0200 |
commit | f0dec5907bd49bb468089b0fe50d8cbf2979272e (patch) | |
tree | f6ca989d6233cfc591efe07660e6dbb774d5f505 /include | |
parent | ec2ee67b805b3f431db4ce2f9cdfc8d74aadfe35 (diff) | |
parent | 3119060c9c8905b9d07e04a342a2c32cf0bf1358 (diff) |
Merge pull request #76 from valmat/ini
Implemented issue # 64
Diffstat (limited to 'include')
-rw-r--r-- | include/call.h | 4 | ||||
-rw-r--r-- | include/extension.h | 2 | ||||
-rw-r--r-- | include/ini.h | 163 | ||||
-rw-r--r-- | include/namespace.h | 51 |
4 files changed, 216 insertions, 4 deletions
diff --git a/include/call.h b/include/call.h index 9be5c91..2fcc9b0 100644 --- a/include/call.h +++ b/include/call.h @@ -67,7 +67,7 @@ inline void unset(const HashMember<Value> &member) { member.unset(); } /** * The isset function conflicts with the 'isset' macro defined by the Zend engine */ -#pragma push_macro("isset"); +#pragma push_macro("isset") #undef isset /** @@ -81,7 +81,7 @@ inline Value isset(const HashMember<Value> &member) { return member.exists() && /** * Re-install the ISSET macro */ -#pragma pop_macro("isset"); +#pragma pop_macro("isset") /** * End of namespace diff --git a/include/extension.h b/include/extension.h index 84789d3..fcc0f72 100644 --- a/include/extension.h +++ b/include/extension.h @@ -123,7 +123,7 @@ public: { return module(); } - + private: /** * The implementation object diff --git a/include/ini.h b/include/ini.h new file mode 100644 index 0000000..9d4cbd9 --- /dev/null +++ b/include/ini.h @@ -0,0 +1,163 @@ +/** + * Ini.h + * + * + * + * + * @copyright 2013 Copernica BV + */ + +/** + * Forward declaration + */ + +struct _zend_ini_entry; + +/** + * Set up namespace + */ +namespace Php { + + + /** + * Class definition + */ + class Ini + { + public: + + /** + * Supported place-types for ini setting + * The possible settings for where the configuration can be changed are: + * PHP_INI_USER, PHP_INI_PERDIR, PHP_INI_SYSTEM and PHP_INI_ALL + * Usually you would choose where the setting can be changed based on how it is used. For example if you want to access + * the setting during RINIT stage then you would want PHP_INI_PERDIR because the setting would have no use after RINIT. + */ + enum Place : int { + User = (1<<0), // ZEND_INI_USER (1<<0) + Perdir = (1<<1), // ZEND_INI_PERDIR (1<<1) + System = (1<<2), // ZEND_INI_SYSTEM (1<<2) + All = (1<<0) | (1<<1) | (1<<2) // ZEND_INI_ALL (ZEND_INI_USER|ZEND_INI_PERDIR|ZEND_INI_SYSTEM) + }; + + /** + * default constructors + */ + Ini(const char *name, const char *value, const char *orig_value, const Place place = Place::All) : + _name(name), _value(value), _orig_value(orig_value), _place(place) {} + + Ini(const char *name, const char *value, const Place place = Place::All) : + _name(name), _value(value), _orig_empty(true), _place(place) {} + + /** + * Constructors for bool value + */ + Ini(const char *name,const bool value, const bool orig_value, const Place place = Place::All) : + _name(name), _value(bool2str(value)), _orig_value(bool2str(orig_value)), _place(place) {} + + Ini(const char *name, const bool value, const Place place = Place::All) : + _name(name), _value(bool2str(value)), _orig_empty(true), _place(place) {} + + /** + * Constructors for integer value + * @param value + */ + Ini(const char *name, const int16_t value, const int16_t orig_value, const Place place = Place::All) : + _name(name), _value(std::to_string(value)), _orig_value(std::to_string(orig_value)), _place(place) {} + + Ini(const char *name, const int16_t value, const Place place = Place::All) : + _name(name), _value(std::to_string(value)), _orig_empty(true), _place(place) {} + + + Ini(const char *name, const int32_t value, const int32_t orig_value, const Place place = Place::All) : + _name(name), _value(std::to_string(value)), _orig_value(std::to_string(orig_value)), _place(place) {} + + Ini(const char *name, const int32_t value, const Place place = Place::All) : + _name(name), _value(std::to_string(value)), _orig_empty(true), _place(place) {} + + + Ini(const char *name, const int64_t value, const int64_t orig_value, const Place place = Place::All) : + _name(name), _value(std::to_string(value)), _orig_value(std::to_string(orig_value)), _place(place) {} + + Ini(const char *name, const int64_t value, const Place place = Place::All) : + _name(name), _value(std::to_string(value)), _orig_empty(true), _place(place) {} + + /** + * Constructors for float value + * @param value + */ + Ini(const char *name, const double value, const double orig_value, const Place place = Place::All) : + _name(name), _value(std::to_string(value)), _orig_value(std::to_string(orig_value)), _place(place) {} + + Ini(const char *name, const double value, const Place place = Place::All) : + _name(name), _value(std::to_string(value)), _orig_empty(true), _place(place) {} + + + /** + * Copy constructor + * @param Ini + */ + Ini(const Ini &that) : + _name(that._name), _value(that._value), _orig_value(that._orig_value), _orig_empty(that._orig_empty), _place(that._place) + {} + + /** + * Move constructor + * @param Ini + */ + Ini(Ini &&that) : + _name(that._name), _value(std::move(that._value)), _orig_value(std::move(that._orig_value)), _orig_empty(that._orig_empty), _place(that._place) + {} + + + /** + * Filling ini_entries + * @param zend_ini_entry *ini_entry, int module_number + * @param int module_number + */ + void fill(_zend_ini_entry *ini_entry, int module_number); + + + /** + * Compare by name + * A predicate that takes two arguments of type Ini. + * Used when adding elements of type Ini in the container std::set + */ + struct Compare + { + int operator()(const std::shared_ptr<Ini> &s1, const std::shared_ptr<Ini> &s2) const + { + return s1->_name.compare(s2->_name); + } + }; + + private: + + static constexpr const char* bool2str(const bool value) + { + return ( static_cast<bool>(value) ? "On" : "Off"); + } + + // ini entry name + std::string _name; + + // ini entry value + std::string _value; + + // ini entry original value + std::string _orig_value; + + // _orig_value is empty + bool _orig_empty = false; + + // plase where the configuration can be changed + Place _place; + }; + + + +/** + * End of namespace + */ +} + diff --git a/include/namespace.h b/include/namespace.h index 1775061..1c9d457 100644 --- a/include/namespace.h +++ b/include/namespace.h @@ -48,6 +48,12 @@ protected: */ std::list<std::shared_ptr<Namespace>> _namespaces; + /** + * Ini entry defined by the extension + * @var list + */ + std::set<std::shared_ptr<Ini>, Ini::Compare> _ini_entries; + public: /** * Constructor @@ -159,6 +165,34 @@ public: } /** + * Add a ini entry to the extension by moving it + * @param ini The class implementation + * @return Namespace Same object to allow chaining + */ + Namespace &add(Ini &&ini) + { + // and add it to the list of classes + _ini_entries.emplace(new Ini(std::move(ini))); + + // allow chaining + return *this; + } + + /** + * Add a ini entry to the extension by copying it + * @param ini The class implementation + * @param Namespace Same object to allow chaining + */ + Namespace &add(const Ini &ini) + { + // and add it to the list of classes + _ini_entries.emplace(new Ini(ini)); + + // allow chaining + return *this; + } + + /** * The total number of functions * @return size_t */ @@ -173,6 +207,15 @@ public: // done return result; } + + /** + * The total number of ini entries + * @return size_t + */ + size_t ini_size() + { + return _ini_entries.size(); + } /** * Apply a callback to each registered function @@ -193,7 +236,13 @@ public: * @param callback */ void classes(const std::function<void(const std::string &ns, ClassBase &clss)> &callback); - + + /** + * Filling ini entries into external zend_ini_entry array + * @param zend_ini_entry* + */ + void fill_ini(_zend_ini_entry *ini_entries, int module_number); + }; /** |