mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-21 15:51:43 +02:00
- VS2012: build/tests
- JSON: style and exceptions catch by ref fix - NumberParser: case-insensitive hex parsing - Dynamic::Var: const std::string& cast operator specialization (coaxing std::string ctor) - LocalDateTime: strftime fix (buffer too small for full tz string, use %Z instead of %z - makes no difference on windows but is more portable) - small buildwin.cmd vsvars32.bat call fix
This commit is contained in:
@@ -37,45 +37,52 @@
|
||||
#include "Poco/JSON/Object.h"
|
||||
#include "Poco/JSON/Stringifier.h"
|
||||
|
||||
namespace Poco
|
||||
{
|
||||
namespace JSON
|
||||
{
|
||||
|
||||
using Poco::Dynamic::Var;
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace JSON {
|
||||
|
||||
|
||||
Array::Array()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
Array::Array(const Array& copy) : _values(copy._values)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
Array::~Array()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
DynamicAny Array::get(unsigned int index) const
|
||||
|
||||
Var Array::get(unsigned int index) const
|
||||
{
|
||||
DynamicAny value;
|
||||
Var value;
|
||||
try
|
||||
{
|
||||
value = _values.at(index);
|
||||
}
|
||||
catch(std::out_of_range)
|
||||
catch(std::out_of_range&)
|
||||
{
|
||||
//Ignore, we return an empty value
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
Array::Ptr Array::getArray(unsigned int index) const
|
||||
{
|
||||
Array::Ptr result;
|
||||
|
||||
DynamicAny value = get(index);
|
||||
Var value = get(index);
|
||||
if ( value.type() == typeid(Array::Ptr) )
|
||||
{
|
||||
result = value.extract<Array::Ptr>();
|
||||
@@ -88,7 +95,7 @@ Object::Ptr Array::getObject(unsigned int index) const
|
||||
{
|
||||
Object::Ptr result;
|
||||
|
||||
DynamicAny value = get(index);
|
||||
Var value = get(index);
|
||||
if ( value.type() == typeid(Object::Ptr) )
|
||||
{
|
||||
result = value.extract<Object::Ptr>();
|
||||
@@ -96,9 +103,10 @@ Object::Ptr Array::getObject(unsigned int index) const
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
bool Array::isObject(unsigned int index) const
|
||||
{
|
||||
DynamicAny value = get(index);
|
||||
Var value = get(index);
|
||||
return value.type() == typeid(Object::Ptr);
|
||||
}
|
||||
|
||||
@@ -144,4 +152,5 @@ void Array::stringify(std::ostream& out, unsigned int indent) const
|
||||
out << "]";
|
||||
}
|
||||
|
||||
|
||||
}} // Namespace Poco::JSON
|
||||
|
@@ -36,15 +36,19 @@
|
||||
#include "Poco/JSON/DefaultHandler.h"
|
||||
#include "Poco/JSON/Object.h"
|
||||
|
||||
namespace Poco
|
||||
{
|
||||
namespace JSON
|
||||
{
|
||||
|
||||
using Poco::Dynamic::Var;
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace JSON {
|
||||
|
||||
|
||||
DefaultHandler::DefaultHandler() : Handler()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
DefaultHandler::~DefaultHandler()
|
||||
{
|
||||
}
|
||||
@@ -60,7 +64,7 @@ void DefaultHandler::startObject()
|
||||
}
|
||||
else
|
||||
{
|
||||
DynamicAny parent = _stack.top();
|
||||
Var parent = _stack.top();
|
||||
|
||||
if ( parent.type() == typeid(Array::Ptr) )
|
||||
{
|
||||
@@ -96,7 +100,7 @@ void DefaultHandler::startArray()
|
||||
}
|
||||
else
|
||||
{
|
||||
DynamicAny parent = _stack.top();
|
||||
Var parent = _stack.top();
|
||||
|
||||
if ( parent.type() == typeid(Array::Ptr) )
|
||||
{
|
||||
@@ -128,9 +132,9 @@ void DefaultHandler::key(const std::string& k)
|
||||
}
|
||||
|
||||
|
||||
void DefaultHandler::setValue(const Poco::DynamicAny& value)
|
||||
void DefaultHandler::setValue(const Var& value)
|
||||
{
|
||||
DynamicAny parent = _stack.top();
|
||||
Var parent = _stack.top();
|
||||
|
||||
if ( parent.type() == typeid(Array::Ptr) )
|
||||
{
|
||||
|
@@ -40,10 +40,12 @@
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
||||
namespace Poco
|
||||
{
|
||||
namespace JSON
|
||||
{
|
||||
|
||||
using Poco::Dynamic::Var;
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace JSON {
|
||||
|
||||
|
||||
Object::Object()
|
||||
@@ -51,19 +53,21 @@ Object::Object()
|
||||
|
||||
}
|
||||
|
||||
|
||||
Object::Object(const Object& copy) : _values(copy._values)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Object::~Object()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
DynamicAny Object::get(const std::string& key) const
|
||||
Var Object::get(const std::string& key) const
|
||||
{
|
||||
DynamicAny value;
|
||||
Var value;
|
||||
|
||||
ValueMap::const_iterator it = _values.find(key);
|
||||
if ( it != _values.end() )
|
||||
@@ -78,7 +82,7 @@ Array::Ptr Object::getArray(const std::string& key) const
|
||||
{
|
||||
Array::Ptr result;
|
||||
|
||||
DynamicAny value = get(key);
|
||||
Var value = get(key);
|
||||
if ( value.type() == typeid(Array::Ptr) )
|
||||
{
|
||||
result = value.extract<Array::Ptr>();
|
||||
@@ -91,7 +95,7 @@ Object::Ptr Object::getObject(const std::string& key) const
|
||||
{
|
||||
Object::Ptr result;
|
||||
|
||||
DynamicAny value = get(key);
|
||||
Var value = get(key);
|
||||
if ( value.type() == typeid(Object::Ptr) )
|
||||
{
|
||||
result = value.extract<Object::Ptr>();
|
||||
|
1384
JSON/src/Parser.cpp
1384
JSON/src/Parser.cpp
File diff suppressed because it is too large
Load Diff
@@ -41,24 +41,29 @@
|
||||
|
||||
#include "Poco/JSON/Query.h"
|
||||
|
||||
namespace Poco
|
||||
{
|
||||
namespace JSON
|
||||
{
|
||||
|
||||
Query::Query(const DynamicAny& source) : _source(source)
|
||||
using Poco::Dynamic::Var;
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace JSON {
|
||||
|
||||
|
||||
Query::Query(const Var& source) : _source(source)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
Query::~Query()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Object::Ptr Query::findObject(const std::string& path) const
|
||||
{
|
||||
Object::Ptr obj;
|
||||
DynamicAny result = find(path);
|
||||
Var result = find(path);
|
||||
if ( result.type() == typeid(Object::Ptr) )
|
||||
{
|
||||
obj = result.extract<Object::Ptr>();
|
||||
@@ -66,10 +71,11 @@ Object::Ptr Query::findObject(const std::string& path) const
|
||||
return obj;
|
||||
}
|
||||
|
||||
|
||||
Array::Ptr Query::findArray(const std::string& path) const
|
||||
{
|
||||
Array::Ptr arr;
|
||||
DynamicAny result = find(path);
|
||||
Var result = find(path);
|
||||
if ( result.type() == typeid(Array::Ptr) )
|
||||
{
|
||||
arr = result.extract<Array::Ptr>();
|
||||
@@ -78,9 +84,9 @@ Array::Ptr Query::findArray(const std::string& path) const
|
||||
}
|
||||
|
||||
|
||||
DynamicAny Query::find(const std::string& path) const
|
||||
Var Query::find(const std::string& path) const
|
||||
{
|
||||
DynamicAny result = _source;
|
||||
Var result = _source;
|
||||
StringTokenizer tokenizer(path, ".");
|
||||
for(StringTokenizer::Iterator token = tokenizer.begin(); token != tokenizer.end(); token++)
|
||||
{
|
||||
@@ -138,4 +144,5 @@ DynamicAny Query::find(const std::string& path) const
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}} // Namespace Poco::JSON
|
||||
|
@@ -39,12 +39,15 @@
|
||||
#include "Poco/JSON/Array.h"
|
||||
#include "Poco/JSON/Object.h"
|
||||
|
||||
namespace Poco
|
||||
{
|
||||
namespace JSON
|
||||
{
|
||||
|
||||
void Stringifier::stringify(const DynamicAny& any, std::ostream& out, unsigned int indent)
|
||||
using Poco::Dynamic::Var;
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace JSON {
|
||||
|
||||
|
||||
void Stringifier::stringify(const Var& any, std::ostream& out, unsigned int indent)
|
||||
{
|
||||
if ( any.type() == typeid(Object::Ptr) )
|
||||
{
|
||||
@@ -111,4 +114,5 @@ void Stringifier::stringify(const DynamicAny& any, std::ostream& out, unsigned i
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}} // Namespace Poco::JSON
|
||||
|
@@ -38,13 +38,17 @@
|
||||
#include "Poco/JSON/TemplateCache.h"
|
||||
#include "Poco/JSON/Query.h"
|
||||
|
||||
namespace Poco
|
||||
{
|
||||
namespace JSON
|
||||
{
|
||||
|
||||
using Poco::Dynamic::Var;
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace JSON {
|
||||
|
||||
|
||||
POCO_IMPLEMENT_EXCEPTION(JSONTemplateException, Exception, "Template Exception")
|
||||
|
||||
|
||||
class Part
|
||||
{
|
||||
public:
|
||||
@@ -58,11 +62,12 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual void render(const DynamicAny& data, std::ostream& out) const = 0;
|
||||
virtual void render(const Var& data, std::ostream& out) const = 0;
|
||||
|
||||
typedef std::vector<SharedPtr<Part> > VectorParts;
|
||||
};
|
||||
|
||||
|
||||
class StringPart : public Part
|
||||
{
|
||||
public:
|
||||
@@ -81,7 +86,7 @@ public:
|
||||
}
|
||||
|
||||
|
||||
void render(const DynamicAny& data, std::ostream& out) const
|
||||
void render(const Var& data, std::ostream& out) const
|
||||
{
|
||||
out << _content;
|
||||
}
|
||||
@@ -103,6 +108,7 @@ private:
|
||||
std::string _content;
|
||||
};
|
||||
|
||||
|
||||
class MultiPart : public Part
|
||||
{
|
||||
public:
|
||||
@@ -125,7 +131,7 @@ public:
|
||||
}
|
||||
|
||||
|
||||
void render(const DynamicAny& data, std::ostream& out) const
|
||||
void render(const Var& data, std::ostream& out) const
|
||||
{
|
||||
for(VectorParts::const_iterator it = _parts.begin(); it != _parts.end(); ++it)
|
||||
{
|
||||
@@ -138,6 +144,7 @@ protected:
|
||||
VectorParts _parts;
|
||||
};
|
||||
|
||||
|
||||
class EchoPart : public Part
|
||||
{
|
||||
public:
|
||||
@@ -151,10 +158,10 @@ public:
|
||||
}
|
||||
|
||||
|
||||
void render(const DynamicAny& data, std::ostream& out) const
|
||||
void render(const Var& data, std::ostream& out) const
|
||||
{
|
||||
Query query(data);
|
||||
DynamicAny value = query.find(_query);
|
||||
Var value = query.find(_query);
|
||||
|
||||
if ( ! value.isEmpty() )
|
||||
{
|
||||
@@ -167,6 +174,7 @@ private:
|
||||
std::string _query;
|
||||
};
|
||||
|
||||
|
||||
class LogicQuery
|
||||
{
|
||||
public:
|
||||
@@ -178,18 +186,18 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual bool apply(const DynamicAny& data) const
|
||||
virtual bool apply(const Var& data) const
|
||||
{
|
||||
bool logic = false;
|
||||
|
||||
Query query(data);
|
||||
DynamicAny value = query.find(_queryString);
|
||||
Var value = query.find(_queryString);
|
||||
|
||||
if ( ! value.isEmpty() ) // When empty, logic will be false
|
||||
{
|
||||
if ( value.isString() )
|
||||
// An empty string must result in false, otherwise true
|
||||
// Which is not the case when we convert to bool with DynamicAny
|
||||
// Which is not the case when we convert to bool with Var
|
||||
{
|
||||
std::string s = value.convert<std::string>();
|
||||
logic = ! s.empty();
|
||||
@@ -198,7 +206,7 @@ public:
|
||||
{
|
||||
// All other values, try to convert to bool
|
||||
// An empty object or array will turn into false
|
||||
// all other values depend on the convert<> in DynamicAny
|
||||
// all other values depend on the convert<> in Var
|
||||
logic = value.convert<bool>();
|
||||
}
|
||||
}
|
||||
@@ -210,6 +218,7 @@ protected:
|
||||
std::string _queryString;
|
||||
};
|
||||
|
||||
|
||||
class LogicExistQuery : public LogicQuery
|
||||
{
|
||||
public:
|
||||
@@ -221,10 +230,10 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual bool apply(const DynamicAny& data) const
|
||||
virtual bool apply(const Var& data) const
|
||||
{
|
||||
Query query(data);
|
||||
DynamicAny value = query.find(_queryString);
|
||||
Var value = query.find(_queryString);
|
||||
|
||||
return !value.isEmpty();
|
||||
}
|
||||
@@ -242,7 +251,7 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual bool apply(const DynamicAny& data) const
|
||||
virtual bool apply(const Var& data) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@@ -273,7 +282,7 @@ public:
|
||||
_queries.push_back(new LogicElseQuery());
|
||||
}
|
||||
|
||||
void render(const DynamicAny& data, std::ostream& out) const
|
||||
void render(const Var& data, std::ostream& out) const
|
||||
{
|
||||
int count = 0;
|
||||
for(std::vector<SharedPtr<LogicQuery> >::const_iterator it = _queries.begin(); it != _queries.end(); ++it, ++count)
|
||||
@@ -291,6 +300,7 @@ private:
|
||||
std::vector<SharedPtr<LogicQuery> > _queries;
|
||||
};
|
||||
|
||||
|
||||
class LoopPart : public MultiPart
|
||||
{
|
||||
public:
|
||||
@@ -304,7 +314,7 @@ public:
|
||||
|
||||
}
|
||||
|
||||
void render(const DynamicAny& data, std::ostream& out) const
|
||||
void render(const Var& data, std::ostream& out) const
|
||||
{
|
||||
Query query(data);
|
||||
|
||||
@@ -316,7 +326,7 @@ public:
|
||||
{
|
||||
for(int i = 0; i < array->size(); i++)
|
||||
{
|
||||
DynamicAny value = array->get(i);
|
||||
Var value = array->get(i);
|
||||
dataObject->set(_name, value);
|
||||
MultiPart::render(data, out);
|
||||
}
|
||||
@@ -361,7 +371,7 @@ public:
|
||||
}
|
||||
|
||||
|
||||
void render(const DynamicAny& data, std::ostream& out) const
|
||||
void render(const Var& data, std::ostream& out) const
|
||||
{
|
||||
TemplateCache* cache = TemplateCache::instance();
|
||||
if ( cache == NULL )
|
||||
@@ -383,12 +393,14 @@ private:
|
||||
|
||||
};
|
||||
|
||||
|
||||
Template::Template(const Path& templatePath)
|
||||
: _parts(NULL)
|
||||
, _templatePath(templatePath)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Template::Template()
|
||||
: _parts(NULL)
|
||||
{
|
||||
@@ -713,6 +725,7 @@ void Template::readWhiteSpace(std::istream& in)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::string Template::readString(std::istream& in)
|
||||
{
|
||||
std::string str;
|
||||
@@ -728,9 +741,11 @@ std::string Template::readString(std::istream& in)
|
||||
return str;
|
||||
}
|
||||
|
||||
void Template::render(const DynamicAny& data, std::ostream& out) const
|
||||
|
||||
void Template::render(const Var& data, std::ostream& out) const
|
||||
{
|
||||
_parts->render(data, out);
|
||||
}
|
||||
|
||||
|
||||
}} // Namespace Poco::JSON
|
||||
|
@@ -94,7 +94,7 @@ Template::Ptr TemplateCache::getTemplate(const Path& path)
|
||||
tpl->parse();
|
||||
_cache[templatePathname] = tpl;
|
||||
}
|
||||
catch(JSONTemplateException jte)
|
||||
catch(JSONTemplateException& jte)
|
||||
{
|
||||
if ( _logger )
|
||||
{
|
||||
@@ -128,7 +128,7 @@ Template::Ptr TemplateCache::getTemplate(const Path& path)
|
||||
tpl->parse();
|
||||
_cache[templatePathname] = tpl;
|
||||
}
|
||||
catch(JSONTemplateException jte)
|
||||
catch(JSONTemplateException& jte)
|
||||
{
|
||||
if ( _logger )
|
||||
{
|
||||
|
Reference in New Issue
Block a user