summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2014-04-10 11:36:44 +0200
committerEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2014-04-10 11:36:44 +0200
commitf0dec5907bd49bb468089b0fe50d8cbf2979272e (patch)
treef6ca989d6233cfc591efe07660e6dbb774d5f505 /include
parentec2ee67b805b3f431db4ce2f9cdfc8d74aadfe35 (diff)
parent3119060c9c8905b9d07e04a342a2c32cf0bf1358 (diff)
Merge pull request #76 from valmat/ini
Implemented issue # 64
Diffstat (limited to 'include')
-rw-r--r--include/call.h4
-rw-r--r--include/extension.h2
-rw-r--r--include/ini.h163
-rw-r--r--include/namespace.h51
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);
+
};
/**