Skip to content

Commit 579842b

Browse files
committed
handler reference counting
- handler reference counting - parser returns parsing result
1 parent 4668c13 commit 579842b

7 files changed

Lines changed: 122 additions & 189 deletions

File tree

‎JSON/include/Poco/JSON/Handler.h‎

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141

4242

4343
#include "Poco/JSON/JSON.h"
44+
#include "Poco/SharedPtr.h"
4445
#include "Poco/Dynamic/Var.h"
4546

4647

@@ -51,8 +52,13 @@ namespace JSON {
5152
class JSON_API Handler
5253
{
5354
public:
55+
typedef SharedPtr<Handler> Ptr;
56+
5457
Handler();
5558
/// Constructor;
59+
60+
virtual ~Handler();
61+
/// Destructor
5662

5763
virtual void startObject() = 0;
5864
/// The parser has read a {, meaning a new object will be read
@@ -100,12 +106,9 @@ class JSON_API Handler
100106
virtual void comma();
101107
/// A comma is read
102108

103-
protected:
104-
105-
virtual ~Handler();
106-
/// Destructor
107-
108-
private:
109+
virtual Dynamic::Var result() const;
110+
/// Returns the result of the parser (an object, array or string),
111+
/// empty Var if there is no result.
109112
};
110113

111114

‎JSON/include/Poco/JSON/ParseHandler.h‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ class JSON_API ParseHandler : public Handler
5454
/// on the handlers called by the parser.
5555
{
5656
public:
57-
5857
ParseHandler(bool preserveObjectOrder = false);
5958
/// Creates the ParseHandler.
6059

‎JSON/include/Poco/JSON/Parser.h‎

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
#include "Poco/JSON/JSON.h"
4444
#include "Poco/JSON/Object.h"
4545
#include "Poco/JSON/Array.h"
46-
#include "Poco/JSON/Handler.h"
46+
#include "Poco/JSON/ParseHandler.h"
4747
#include "Poco/Dynamic/Var.h"
4848
#include "Poco/StreamTokenizer.h"
4949
#include <istream>
@@ -59,24 +59,27 @@ class JSON_API Parser
5959
{
6060
public:
6161

62-
Parser();
62+
Parser(const Handler::Ptr& pHandler = new ParseHandler);
6363
/// Constructor.
6464

6565
virtual ~Parser();
6666
/// Destructor.
6767

68-
void parse(const std::string& source);
68+
Dynamic::Var parse(const std::string& source);
6969
/// Parses a string.
7070

71-
void parse(std::istream& in);
71+
Dynamic::Var parse(std::istream& in);
7272
/// Parses a JSON from the input stream.
7373

74-
void setHandler(Handler* handler);
74+
void setHandler(const Handler::Ptr& pHandler);
7575
/// Set the handler.
7676

77-
Handler* getHandler();
77+
const Handler::Ptr& getHandler();
7878
/// Returns the handler.
7979

80+
Dynamic::Var result() const;
81+
/// Returns the result of parsing;
82+
8083
private:
8184
const Token* nextToken();
8285
/// Returns the next token.
@@ -97,26 +100,32 @@ class JSON_API Parser
97100
/// Read all elements of an array.
98101

99102
StreamTokenizer _tokenizer;
100-
Handler* _handler;
103+
Handler::Ptr _pHandler;
101104
};
102105

103106

104-
inline void Parser::parse(const std::string& source)
107+
inline Dynamic::Var Parser::parse(const std::string& source)
105108
{
106109
std::istringstream is(source);
107-
parse(is);
110+
return parse(is);
111+
}
112+
113+
114+
inline void Parser::setHandler(const Handler::Ptr& pHandler)
115+
{
116+
_pHandler = pHandler;
108117
}
109118

110119

111-
inline void Parser::setHandler(Handler* handler)
120+
inline const Handler::Ptr& Parser::getHandler()
112121
{
113-
_handler = handler;
122+
return _pHandler;
114123
}
115124

116125

117-
inline Handler* Parser::getHandler()
126+
inline Dynamic::Var Parser::result() const
118127
{
119-
return _handler;
128+
return _pHandler->result();
120129
}
121130

122131

‎JSON/include/Poco/JSON/PrintHandler.h‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ class JSON_API PrintHandler : public Handler
5555
/// otherwise, the proper indentation is applied to elements.
5656
{
5757
public:
58+
typedef SharedPtr<PrintHandler> Ptr;
59+
5860
static const unsigned JSON_PRINT_FLAT = 0;
5961

6062
PrintHandler(unsigned indent = 0);
@@ -115,10 +117,8 @@ class JSON_API PrintHandler : public Handler
115117
void comma();
116118
/// A comma is read; it will be written to the output as "true" or "false".
117119

118-
void setIndent(unsigned indent)
119-
{
120-
_indent = indent;
121-
}
120+
void setIndent(unsigned indent);
121+
/// Sets indentation.
122122

123123
private:
124124

@@ -133,6 +133,12 @@ class JSON_API PrintHandler : public Handler
133133
};
134134

135135

136+
inline void PrintHandler::setIndent(unsigned indent)
137+
{
138+
_indent = indent;
139+
}
140+
141+
136142
}} // namespace Poco::JSON
137143

138144

‎JSON/src/Handler.cpp‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,10 @@ void Handler::comma()
5757
}
5858

5959

60+
Dynamic::Var Handler::result() const
61+
{
62+
return Dynamic::Var();
63+
}
64+
65+
6066
} } // namespace Poco::JSON

‎JSON/src/Parser.cpp‎

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ class NumberToken: public Token
484484
};
485485

486486

487-
Parser::Parser() : _tokenizer(), _handler(NULL)
487+
Parser::Parser(const Handler::Ptr& pHandler) : _tokenizer(), _pHandler(pHandler)
488488
{
489489
_tokenizer.addToken(new WhitespaceToken());
490490
_tokenizer.addToken(new InvalidToken());
@@ -512,7 +512,7 @@ const Token* Parser::nextToken()
512512
}
513513

514514

515-
void Parser::parse(std::istream& in)
515+
Dynamic::Var Parser::parse(std::istream& in)
516516
{
517517
_tokenizer.attachToStream(in);
518518
const Token* token = nextToken();
@@ -542,24 +542,26 @@ void Parser::parse(std::istream& in)
542542
{
543543
throw JSONException(format("Invalid token '%s' found. Expecting { or [", token->asString()));
544544
}
545+
546+
return result();
545547
}
546548

547549

548550
void Parser::readObject()
549551
{
550-
if (_handler != NULL)
552+
if (!_pHandler.isNull())
551553
{
552-
_handler->startObject();
554+
_pHandler->startObject();
553555
}
554556

555557
if ( readRow(true) ) // First call is special: check for empty object
556558
{
557559
while(readRow());
558560
}
559561

560-
if (_handler != NULL)
562+
if (!_pHandler.isNull())
561563
{
562-
_handler->endObject();
564+
_pHandler->endObject();
563565
}
564566
}
565567

@@ -576,9 +578,9 @@ bool Parser::readRow(bool firstCall)
576578
if (token->tokenClass() == Token::STRING_LITERAL_TOKEN)
577579
{
578580
std::string propertyName = token->tokenString();
579-
if ( _handler != NULL )
581+
if ( !_pHandler.isNull() )
580582
{
581-
_handler->key(propertyName);
583+
_pHandler->key(propertyName);
582584
}
583585

584586
token = nextToken();
@@ -594,9 +596,9 @@ bool Parser::readRow(bool firstCall)
594596
{
595597
if (token->asChar() == ',')
596598
{
597-
if (_handler != NULL)
599+
if (!_pHandler.isNull())
598600
{
599-
_handler->comma();
601+
_pHandler->comma();
600602
}
601603
return true; // Read next row
602604
}
@@ -637,7 +639,7 @@ void Parser::readValue(const Token* token)
637639
break;
638640

639641
case Token::INTEGER_LITERAL_TOKEN:
640-
if (_handler != NULL)
642+
if (!_pHandler.isNull())
641643
{
642644
#if defined(POCO_HAVE_INT64)
643645
try
@@ -647,11 +649,11 @@ void Parser::readValue(const Token* token)
647649
if ( value > std::numeric_limits<int>::max()
648650
|| value < std::numeric_limits<int>::min() )
649651
{
650-
_handler->value(value);
652+
_pHandler->value(value);
651653
}
652654
else
653655
{
654-
_handler->value(static_cast<int>(value));
656+
_pHandler->value(static_cast<int>(value));
655657
}
656658
}
657659
// try to handle error as unsigned in case of overflow
@@ -661,11 +663,11 @@ void Parser::readValue(const Token* token)
661663
// if number is 32-bit, then handle as such
662664
if ( value > std::numeric_limits<unsigned>::max() )
663665
{
664-
_handler->value(value);
666+
_pHandler->value(value);
665667
}
666668
else
667669
{
668-
_handler->value(static_cast<unsigned>(value));
670+
_pHandler->value(static_cast<unsigned>(value));
669671
}
670672
}
671673
#else
@@ -687,23 +689,23 @@ void Parser::readValue(const Token* token)
687689
{
688690
if (token->tokenString().compare("null") == 0)
689691
{
690-
if (_handler != NULL)
692+
if (!_pHandler.isNull())
691693
{
692-
_handler->null();
694+
_pHandler->null();
693695
}
694696
}
695697
else if (token->tokenString().compare("true") == 0)
696698
{
697-
if (_handler != NULL)
699+
if (!_pHandler.isNull())
698700
{
699-
_handler->value(true);
701+
_pHandler->value(true);
700702
}
701703
}
702704
else if (token->tokenString().compare("false") == 0)
703705
{
704-
if (_handler != NULL)
706+
if (!_pHandler.isNull())
705707
{
706-
_handler->value(false);
708+
_pHandler->value(false);
707709
}
708710
}
709711
else
@@ -715,15 +717,15 @@ void Parser::readValue(const Token* token)
715717
case Token::FLOAT_LITERAL_TOKEN:
716718
// Fall through
717719
case Token::DOUBLE_LITERAL_TOKEN:
718-
if (_handler != NULL)
720+
if (!_pHandler.isNull())
719721
{
720-
_handler->value(token->asFloat());
722+
_pHandler->value(token->asFloat());
721723
}
722724
break;
723725
case Token::STRING_LITERAL_TOKEN:
724-
if (_handler != NULL)
726+
if (!_pHandler.isNull())
725727
{
726-
_handler->value(token->tokenString());
728+
_pHandler->value(token->tokenString());
727729
}
728730
break;
729731
case Token::SEPARATOR_TOKEN:
@@ -746,19 +748,19 @@ void Parser::readValue(const Token* token)
746748

747749
void Parser::readArray()
748750
{
749-
if (_handler != NULL)
751+
if (!_pHandler.isNull())
750752
{
751-
_handler->startArray();
753+
_pHandler->startArray();
752754
}
753755

754756
if (readElements(true)) // First call is special: check for empty array
755757
{
756758
while(readElements());
757759
}
758760

759-
if (_handler != NULL)
761+
if (!_pHandler.isNull())
760762
{
761-
_handler->endArray();
763+
_pHandler->endArray();
762764
}
763765
}
764766

@@ -784,9 +786,9 @@ bool Parser::readElements(bool firstCall)
784786

785787
if (token->asChar() == ',')
786788
{
787-
if (_handler != NULL)
789+
if (!_pHandler.isNull())
788790
{
789-
_handler->comma();
791+
_pHandler->comma();
790792
}
791793
return true;
792794
}

0 commit comments

Comments
 (0)