C++: Make proxies safer

If a user happens to store an ElementProxy or a PropertyProxy
instance, we need to take a reference to the JSON value they point to.
With PropertyProxy, the key needs to be copied as well.
This commit is contained in:
Petri Lehtinen 2010-02-07 14:08:54 +02:00
parent 8d75235ff2
commit acec2559a5
2 changed files with 40 additions and 5 deletions

View File

@ -166,8 +166,9 @@ namespace json {
// proxies an array element
class ElementProxy {
public:
// constructor
ElementProxy(json_t* array, unsigned int index) : _array(array), _index(index) {}
ElementProxy(json_t* array, unsigned int index);
ElementProxy(const ElementProxy& other);
~ElementProxy();
// assign to the proxied element
inline ElementProxy& operator=(const Value& value);
@ -186,8 +187,9 @@ namespace json {
// proxies an object property
class PropertyProxy {
public:
// constructor
PropertyProxy(json_t* array, const char* key) : _object(array), _key(key) {}
PropertyProxy(json_t* object, const char *key);
PropertyProxy(const PropertyProxy& other);
~PropertyProxy();
// assign to the proxied element
inline PropertyProxy& operator=(const Value& value);
@ -200,7 +202,7 @@ namespace json {
json_t* _object;
// key of property
const char* _key;
char* _key;
};
} // namespace json::detail

View File

@ -8,6 +8,8 @@
#error "jansson.ipp may only be included from jansson.hpp"
#endif
#include <string.h>
namespace json {
namespace detail {
// assignment operator
@ -310,6 +312,20 @@ namespace json {
return v;
}
ElementProxy::ElementProxy(json_t* array, unsigned int index)
: _array(array), _index(index) {
json_incref(_array);
}
ElementProxy::ElementProxy(const ElementProxy& other)
: _array(other._array), _index(other._index) {
json_incref(_array);
}
ElementProxy::~ElementProxy() {
json_decref(_array);
}
// assign value to proxied array element
ElementProxy& ElementProxy::operator=(const Value& value) {
json_array_set(_array, _index, value.as_json());
@ -321,6 +337,23 @@ namespace json {
return json_array_get(_array, _index);
}
PropertyProxy::PropertyProxy(json_t* object, const char* key)
: _object(object) {
_key = strdup(key);
json_incref(_object);
}
PropertyProxy::PropertyProxy(const PropertyProxy& other)
: _object(other._object) {
_key = strdup(other._key);
json_incref(_object);
}
PropertyProxy::~PropertyProxy() {
free(_key);
json_decref(_object);
}
// assign value to proxied object property
PropertyProxy& PropertyProxy::operator=(const Value& value) {
json_object_set(_object, _key, value.as_json());