SourceLayout: esi/, take 1
Moved src/ESI* files into src/esi/.
Renamed ESI source files from ESIFoo.{cc,cci,h} to Foo.{cc,cci,h}.
Replaced implicit constructor-based Parser registration with an explicit
call
to Esi::Init() which knows of all ESI parsers. Added Esi::Clean counterpart.
Made libTrie build conditional on ESI support being enabled.
No true source code changes except for parser initialization.
No functionality changes were intended.
No runtime tests with ESI performed.
TODO: I did not move the tests/ESIExpressions test into src/esi because
we need to fix the entire testing layout before we should start
moving individual tests: They currently depend on individual source
and object files in src/ and in tests/ and that kind of dependency
should not be multiplied but removed.
TODO: Move ESI types into the Esi namespace.
Please review and, if you know how to use ESI, test.
Thank you,
Alex.
bb:approve
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: [email protected]\
# 2spv623fkyjly1db
# target_branch: http://www.squid-cache.org/bzr/squid3/trunk
# testament_sha1: 97730ab799d7eedf538ddc42c166b94024bcdb4d
# timestamp: 2009-03-17 14:37:53 -0600
# base_revision_id: [email protected]\
# 23x9uv83xfty1hnf
#
# Begin patch
=== modified file 'configure.in'
--- configure.in 2009-03-09 05:53:08 +0000
+++ configure.in 2009-03-13 21:54:28 +0000
@@ -3808,6 +3808,7 @@
src/adaptation/Makefile \
src/adaptation/icap/Makefile \
src/adaptation/ecap/Makefile \
+ src/esi/Makefile \
src/icmp/Makefile \
src/ip/Makefile \
contrib/Makefile \
=== modified file 'lib/Makefile.am'
--- lib/Makefile.am 2009-03-08 18:41:06 +0000
+++ lib/Makefile.am 2009-03-13 21:47:14 +0000
@@ -3,12 +3,16 @@
# $Id$
#
-SUBDIRS = libTrie
+SUBDIRS =
if USE_LOADABLE_MODULES
SUBDIRS += libLtdl
endif
+if USE_ESI
+SUBDIRS += libTrie
+endif
+
CLEANFILES =
@@ -89,10 +93,8 @@
xusleep.c \
$(XPROF_STATS_SOURCE) \
$(WIN32SRC)
-libmiscutil_a_LIBADD = \
- libTrie/src/Trie.o \
- libTrie/src/TrieNode.o \
- @LIBOBJS@
+libmiscutil_a_LIBADD = @LIBOBJS@
+
# $(top_srcdir)/include/version.h should be a dependency
libntlmauth_a_SOURCES = \
ntlmauth.c
=== modified file 'src/Makefile.am'
--- src/Makefile.am 2009-03-17 02:04:14 +0000
+++ src/Makefile.am 2009-03-17 03:39:54 +0000
@@ -40,6 +40,15 @@
ADAPTATION_LIBS = @ADAPTATION_LIBS@
+if USE_ESI
+SUBDIRS += esi
+ESI_LIBS = \
+ esi/libesi.la \
+ $(top_builddir)/lib/libTrie/src/libTrie.a
+else
+ESI_LIBS =
+endif
+
DELAY_POOL_ALL_SOURCE = \
CommonPool.h \
CompositePoolNode.h \
@@ -70,43 +79,6 @@
DELAY_POOL_SOURCE =
endif
-ESI_ALL_SOURCE = \
- ElementList.h \
- ESI.cc \
- ESI.h \
- ESIAssign.cc \
- ESIAssign.h \
- ESIAttempt.h \
- ESIContext.cc \
- ESIContext.h \
- ESICustomParser.cc \
- ESICustomParser.h \
- ESIElement.h \
- ESIExcept.h \
- ESIExpatParser.cc \
- ESIExpatParser.h \
- ESIExpression.cc \
- ESIExpression.h \
- ESIInclude.cc \
- ESIInclude.h \
- ESILiteral.h \
- ESILibxml2Parser.cc \
- ESILibxml2Parser.h \
- ESIParser.cc \
- ESIParser.h \
- ESISegment.cc \
- ESISegment.h \
- ESISequence.cc \
- ESISequence.h \
- ESIVar.h \
- ESIVarState.cc \
- ESIVarState.h
-if USE_ESI
- ESI_SOURCE = $(ESI_ALL_SOURCE)
-else
- ESI_SOURCE =
-endif
-
if ENABLE_XPROF_STATS
XPROF_STATS_SOURCE = ProfStats.cc
else
@@ -203,7 +175,6 @@
-I$(top_srcdir)/src \
-I$(top_builddir)/include \
-I$(top_srcdir)/include \
- -I$(top_srcdir)/lib/libTrie/include \
-I$(top_builddir)/lib \
-I$(top_srcdir)/lib \
@SQUID_CPPUNIT_INC@
@@ -280,7 +251,6 @@
ipc.cc \
ipc_win32.cc \
$(IDENT_ALL_SOURCE) \
- $(ESI_ALL_SOURCE) \
ProfStats.cc \
LeakFinder.cc \
LeakFinder.h \
@@ -374,7 +344,6 @@
enums.h \
errorpage.cc \
errorpage.h \
- $(ESI_SOURCE) \
ETag.cc \
event.cc \
event.h \
@@ -569,6 +538,7 @@
@REGEXLIB@ \
@SNMPLIB@ \
${ADAPTATION_LIBS} \
+ ${ESI_LIBS} \
@SSLLIB@ \
-lmiscutil \
@XTRA_LIBS@ \
@@ -1068,7 +1038,6 @@
dlink.cc \
$(DNSSOURCE) \
errorpage.cc \
- $(ESI_SOURCE) \
ETag.cc \
external_acl.cc \
ExternalACLEntry.cc \
@@ -1166,6 +1135,7 @@
icmp/libicmp.la icmp/libicmp-core.la \
@REPL_OBJS@ \
${ADAPTATION_LIBS} \
+ ${ESI_LIBS} \
@REGEXLIB@ \
@SNMPLIB@ \
-L../lib -lmiscutil \
@@ -1237,7 +1207,6 @@
dlink.cc \
$(DNSSOURCE) \
errorpage.cc \
- $(ESI_SOURCE) \
ETag.cc \
external_acl.cc \
ExternalACLEntry.cc \
@@ -1334,6 +1303,7 @@
icmp/libicmp.la icmp/libicmp-core.la \
@REPL_OBJS@ \
${ADAPTATION_LIBS} \
+ ${ESI_LIBS} \
@REGEXLIB@ \
@SNMPLIB@ \
-L../lib -lmiscutil \
@@ -1384,7 +1354,6 @@
dlink.cc \
$(DNSSOURCE) \
errorpage.cc \
- $(ESI_SOURCE) \
ETag.cc \
external_acl.cc \
ExternalACLEntry.cc \
@@ -1481,6 +1450,7 @@
icmp/libicmp.la icmp/libicmp-core.la \
@REPL_OBJS@ \
${ADAPTATION_LIBS} \
+ ${ESI_LIBS} \
@REGEXLIB@ \
@SNMPLIB@ \
-L../lib -lmiscutil \
@@ -1520,7 +1490,6 @@
dlink.cc \
$(DNSSOURCE) \
errorpage.cc \
- $(ESI_SOURCE) \
ETag.cc \
external_acl.cc \
ExternalACLEntry.cc \
@@ -1624,6 +1593,7 @@
@REPL_OBJS@ \
@STORE_LIBS_TO_ADD@ \
${ADAPTATION_LIBS} \
+ ${ESI_LIBS} \
@REGEXLIB@ \
@SNMPLIB@ \
-L../lib -lmiscutil \
@@ -1673,7 +1643,6 @@
dlink.cc \
$(DNSSOURCE) \
errorpage.cc \
- $(ESI_SOURCE) \
ETag.cc \
external_acl.cc \
ExternalACLEntry.cc \
@@ -1771,6 +1740,7 @@
icmp/libicmp.la icmp/libicmp-core.la \
@REPL_OBJS@ \
${ADAPTATION_LIBS} \
+ ${ESI_LIBS} \
@REGEXLIB@ \
@SNMPLIB@ \
-L../lib -lmiscutil \
@@ -2022,7 +1992,6 @@
dlink.cc \
$(DNSSOURCE) \
errorpage.cc \
- $(ESI_SOURCE) \
ETag.cc \
external_acl.cc \
ExternalACLEntry.cc \
@@ -2118,6 +2087,7 @@
@REGEXLIB@ \
@REPL_OBJS@ \
${ADAPTATION_LIBS} \
+ ${ESI_LIBS} \
@SNMPLIB@ \
-L../lib -lmiscutil \
@SQUID_CPPUNIT_LIBS@ \
=== modified file 'src/Store.h'
--- src/Store.h 2009-02-08 00:02:47 +0000
+++ src/Store.h 2009-03-10 20:52:45 +0000
@@ -50,7 +50,7 @@
#include "RemovalPolicy.h"
#if USE_SQUID_ESI
-#include "ESIElement.h"
+#include "esi/Element.h"
#endif
class AsyncCall;
=== modified file 'src/cache_cf.cc'
--- src/cache_cf.cc 2009-03-13 20:45:32 +0000
+++ src/cache_cf.cc 2009-03-13 21:54:28 +0000
@@ -57,7 +57,7 @@
#include "snmp.h"
#endif
#if USE_SQUID_ESI
-#include "ESIParser.h"
+#include "esi/Parser.h"
#endif
#if USE_ADAPTATION
=== modified file 'src/client_side_reply.cc'
--- src/client_side_reply.cc 2009-03-08 21:53:27 +0000
+++ src/client_side_reply.cc 2009-03-10 20:52:45 +0000
@@ -48,7 +48,7 @@
#include "clientStream.h"
#include "auth/UserRequest.h"
#if USE_SQUID_ESI
-#include "ESI.h"
+#include "esi/Esi.h"
#endif
#include "MemObject.h"
#include "fde.h"
=== added directory 'src/esi'
=== renamed file 'src/ESIAssign.cc' => 'src/esi/Assign.cc'
--- src/ESIAssign.cc 2009-02-11 17:08:24 +0000
+++ src/esi/Assign.cc 2009-03-10 20:52:45 +0000
@@ -40,9 +40,9 @@
*/
#if (USE_SQUID_ESI == 1)
-#include "ESIAssign.h"
-#include "ESIContext.h"
-#include "ESISequence.h"
+#include "esi/Assign.h"
+#include "esi/Context.h"
+#include "esi/Sequence.h"
ESIAssign::~ESIAssign()
{
=== renamed file 'src/ESIAssign.h' => 'src/esi/Assign.h'
--- src/ESIAssign.h 2009-01-21 03:47:47 +0000
+++ src/esi/Assign.h 2009-03-10 20:52:45 +0000
@@ -37,9 +37,9 @@
#define SQUID_ESIASSIGN_H
#include "squid.h"
-#include "ESIElement.h"
+#include "esi/Element.h"
#include "SquidString.h"
-#include "ESIVarState.h"
+#include "esi/VarState.h"
/* ESIVariableExpression */
/* This is a variable that is itself and expression */
=== renamed file 'src/ESIAttempt.h' => 'src/esi/Attempt.h'
--- src/ESIAttempt.h 2009-01-21 03:47:47 +0000
+++ src/esi/Attempt.h 2009-03-10 20:52:45 +0000
@@ -37,8 +37,8 @@
#define SQUID_ESIATTEMPT_H
#include "squid.h"
-#include "ESIElement.h"
-#include "ESISequence.h"
+#include "esi/Element.h"
+#include "esi/Sequence.h"
/* esiAttempt */
=== renamed file 'src/ESIContext.cc' => 'src/esi/Context.cc'
--- src/ESIContext.cc 2009-01-21 03:47:47 +0000
+++ src/esi/Context.cc 2009-03-10 20:52:45 +0000
@@ -40,7 +40,7 @@
*/
#if (USE_SQUID_ESI == 1)
-#include "ESIContext.h"
+#include "esi/Context.h"
#include "Store.h"
#include "client_side_request.h"
=== renamed file 'src/ESIContext.h' => 'src/esi/Context.h'
--- src/ESIContext.h 2009-01-21 03:47:47 +0000
+++ src/esi/Context.h 2009-03-10 20:52:45 +0000
@@ -34,14 +34,14 @@
#ifndef SQUID_ESICONTEXT_H
#define SQUID_ESICONTEXT_H
-#include "ESIElement.h"
+#include "esi/Element.h"
#include "clientStream.h"
class ESIVarState;
class ClientHttpRequest;
-#include "ESIParser.h"
+#include "esi/Parser.h"
/* ESIContext */
=== renamed file 'src/ESICustomParser.cc' => 'src/esi/CustomParser.cc'
--- src/ESICustomParser.cc 2009-02-10 11:02:53 +0000
+++ src/esi/CustomParser.cc 2009-03-17 15:29:06 +0000
@@ -34,14 +34,14 @@
*/
#include "squid.h"
-#include "ESICustomParser.h"
+#include "esi/CustomParser.h"
#include "Trie.h"
#include "TrieCharTransform.h"
#include "Array.h"
Trie *ESICustomParser::SearchTrie=NULL;
-RegisterESIParser("custom", ESICustomParser);
+EsiParserDefinition(ESICustomParser);
Trie *
ESICustomParser::GetTrie()
=== renamed file 'src/ESICustomParser.h' => 'src/esi/CustomParser.h'
--- src/ESICustomParser.h 2009-01-21 03:47:47 +0000
+++ src/esi/CustomParser.h 2009-03-17 15:29:06 +0000
@@ -35,7 +35,7 @@
class Trie;
/* inherits from */
-#include "ESIParser.h"
+#include "esi/Parser.h"
/* for String variables */
#include "SquidString.h"
@@ -54,8 +54,9 @@
long int lineNumber() const;
char const * errorString() const;
+ EsiParserDeclaration;
+
private:
- ESI_PARSER_TYPE;
static Trie *SearchTrie;
static Trie *GetTrie();
enum ESITAG_t {
=== renamed file 'src/ESIElement.h' => 'src/esi/Element.h'
--- src/ESIElement.h 2009-01-21 03:47:47 +0000
+++ src/esi/Element.h 2009-03-10 20:52:45 +0000
@@ -34,7 +34,7 @@
#define SQUID_ESIELEMENT_H
#include "RefCount.h"
-#include "ESISegment.h"
+#include "esi/Segment.h"
typedef enum {
ESI_PROCESS_COMPLETE = 0,
=== renamed file 'src/ElementList.h' => 'src/esi/ElementList.h'
--- src/ElementList.h 2009-01-21 03:47:47 +0000
+++ src/esi/ElementList.h 2009-03-10 20:52:45 +0000
@@ -37,7 +37,7 @@
#define SQUID_ELEMENTLIST_H
#include "squid.h"
-#include "ESIElement.h"
+#include "esi/Element.h"
class ElementList
{
=== renamed file 'src/ESI.cc' => 'src/esi/Esi.cc'
--- src/ESI.cc 2009-02-11 17:08:24 +0000
+++ src/esi/Esi.cc 2009-03-10 20:52:45 +0000
@@ -38,22 +38,22 @@
*/
#if (USE_SQUID_ESI == 1)
-#include "ESI.h"
+#include "esi/Esi.h"
#include "clientStream.h"
#include "client_side_request.h"
#include "errorpage.h"
-#include "ESISegment.h"
-#include "ESIElement.h"
-#include "ESIContext.h"
+#include "esi/Segment.h"
+#include "esi/Element.h"
+#include "esi/Context.h"
#include "HttpHdrSc.h"
#include "HttpHdrScTarget.h"
#include "HttpReply.h"
-#include "ESIAttempt.h"
-#include "ESIExcept.h"
+#include "esi/Attempt.h"
+#include "esi/Except.h"
#include "client_side.h"
-#include "ESIVarState.h"
-#include "ESIAssign.h"
-#include "ESIExpression.h"
+#include "esi/VarState.h"
+#include "esi/Assign.h"
+#include "esi/Expression.h"
#include "HttpRequest.h"
#include "MemBuf.h"
#include "ip/IpAddress.h"
@@ -116,11 +116,11 @@
MEMPROXY_CLASS_INLINE(esiComment) /**DOCS_NOSEMI*/
-#include "ESILiteral.h"
-
-#include "ESISequence.h"
-
-#include "ESIInclude.h"
+#include "esi/Literal.h"
+
+#include "esi/Sequence.h"
+
+#include "esi/Include.h"
/* esiRemove */
@@ -181,7 +181,7 @@
MEMPROXY_CLASS_INLINE(esiTry) /**DOCS_NOSEMI*/
-#include "ESIVar.h"
+#include "esi/Var.h"
/* esiChoose */
=== renamed file 'src/ESI.h' => 'src/esi/Esi.h'
=== renamed file 'src/ESIExcept.h' => 'src/esi/Except.h'
--- src/ESIExcept.h 2009-01-21 03:47:47 +0000
+++ src/esi/Except.h 2009-03-10 20:52:45 +0000
@@ -37,8 +37,8 @@
#define SQUID_ESIEXCEPT_H
#include "squid.h"
-#include "ESIElement.h"
-#include "ESISequence.h"
+#include "esi/Element.h"
+#include "esi/Sequence.h"
/* esiExcept */
=== renamed file 'src/ESIExpatParser.cc' => 'src/esi/ExpatParser.cc'
--- src/ESIExpatParser.cc 2009-01-21 03:47:47 +0000
+++ src/esi/ExpatParser.cc 2009-03-17 15:29:06 +0000
@@ -37,9 +37,9 @@
#if USE_SQUID_ESI
-#include "ESIExpatParser.h"
+#include "esi/ExpatParser.h"
-RegisterESIParser("expat", ESIExpatParser);
+EsiParserDefinition(ESIExpatParser);
ESIExpatParser::ESIExpatParser(ESIParserClient *aClient) : theClient (aClient)
{
=== renamed file 'src/ESIExpatParser.h' => 'src/esi/ExpatParser.h'
--- src/ESIExpatParser.h 2009-01-21 03:47:47 +0000
+++ src/esi/ExpatParser.h 2009-03-17 15:29:06 +0000
@@ -35,8 +35,8 @@
#if USE_SQUID_ESI
-#include "ESIParser.h"
-#include "expat.h"
+#include "esi/Parser.h"
+#include <expat.h>
class ESIExpatParser : public ESIParser
{
@@ -51,8 +51,9 @@
long int lineNumber() const;
char const * errorString() const;
+ EsiParserDeclaration;
+
private:
- ESI_PARSER_TYPE;
/** our parser */
mutable XML_Parser p;
static void Start(void *data, const XML_Char *el, const char **attr);
=== renamed file 'src/ESIExpression.cc' => 'src/esi/Expression.cc'
--- src/ESIExpression.cc 2009-01-21 03:47:47 +0000
+++ src/esi/Expression.cc 2009-03-10 20:52:45 +0000
@@ -34,7 +34,7 @@
*/
#include "squid.h"
-#include "ESIExpression.h"
+#include "esi/Expression.h"
/* stack precedence rules:
* before pushing an operator onto the stack, the
=== renamed file 'src/ESIExpression.h' => 'src/esi/Expression.h'
=== renamed file 'src/ESIInclude.cc' => 'src/esi/Include.cc'
--- src/ESIInclude.cc 2009-01-21 03:47:47 +0000
+++ src/esi/Include.cc 2009-03-10 20:52:45 +0000
@@ -41,8 +41,8 @@
*/
#if (USE_SQUID_ESI == 1)
-#include "ESIInclude.h"
-#include "ESIVarState.h"
+#include "esi/Include.h"
+#include "esi/VarState.h"
#include "client_side_request.h"
#include "HttpReply.h"
=== renamed file 'src/ESIInclude.h' => 'src/esi/Include.h'
--- src/ESIInclude.h 2009-01-21 03:47:47 +0000
+++ src/esi/Include.h 2009-03-10 20:52:45 +0000
@@ -37,9 +37,9 @@
#define SQUID_ESIINCLUDE_H
#include "squid.h"
-#include "ESISegment.h"
-#include "ESIElement.h"
-#include "ESIContext.h"
+#include "esi/Segment.h"
+#include "esi/Element.h"
+#include "esi/Context.h"
class ESIInclude;
typedef RefCount<ESIInclude> ESIIncludePtr;
=== renamed file 'src/ESILibxml2Parser.cc' => 'src/esi/Libxml2Parser.cc'
--- src/ESILibxml2Parser.cc 2009-01-21 03:47:47 +0000
+++ src/esi/Libxml2Parser.cc 2009-03-17 15:29:06 +0000
@@ -41,13 +41,13 @@
#if USE_SQUID_ESI
-#include "ESILibxml2Parser.h"
+#include "esi/Libxml2Parser.h"
// the global document that will store the resolved entity
// definitions
static htmlDocPtr entity_doc = NULL;
-RegisterESIParser("libxml2", ESILibxml2Parser);
+EsiParserDefinition(ESILibxml2Parser);
// the SAX callback functions
void esi_startElementSAXFunc(void * ctx, const xmlChar * name, const xmlChar ** atts)
=== renamed file 'src/ESILibxml2Parser.h' => 'src/esi/Libxml2Parser.h'
--- src/ESILibxml2Parser.h 2009-01-21 03:47:47 +0000
+++ src/esi/Libxml2Parser.h 2009-03-17 15:29:06 +0000
@@ -42,7 +42,7 @@
#if USE_SQUID_ESI
-#include "ESIParser.h"
+#include "esi/Parser.h"
// workaround for definition of "free" that prevents include of
// parser.h from libxml2 without errors
#ifdef free
@@ -70,8 +70,9 @@
ESIParserClient *getClient() { return theClient; }
+ EsiParserDeclaration;
+
private:
- ESI_PARSER_TYPE;
mutable xmlParserCtxtPtr parser; /* our parser */
ESIParserClient *theClient;
=== renamed file 'src/ESILiteral.h' => 'src/esi/Literal.h'
--- src/ESILiteral.h 2009-01-21 03:47:47 +0000
+++ src/esi/Literal.h 2009-03-10 20:52:45 +0000
@@ -37,7 +37,7 @@
#define SQUID_ESILITERAL_H
#include "squid.h"
-#include "ESIElement.h"
+#include "esi/Element.h"
class ESIContext;
/* esiLiteral */
=== added file 'src/esi/Makefile.am'
--- src/esi/Makefile.am 1970-01-01 00:00:00 +0000
+++ src/esi/Makefile.am 2009-03-17 15:27:56 +0000
@@ -0,0 +1,43 @@
+include $(top_srcdir)/src/Common.am
+include $(top_srcdir)/src/TestHeaders.am
+
+noinst_LTLIBRARIES = libesi.la
+
+libesi_la_SOURCES = \
+ Assign.cc \
+ Assign.h \
+ Attempt.h \
+ Context.cc \
+ Context.h \
+ CustomParser.cc \
+ CustomParser.h \
+ Element.h \
+ ElementList.h \
+ Esi.cc \
+ Esi.h \
+ Except.h \
+ ExpatParser.cc \
+ ExpatParser.h \
+ Expression.cc \
+ Expression.h \
+ Include.cc \
+ Include.h \
+ Literal.h \
+ Libxml2Parser.cc \
+ Libxml2Parser.h \
+ Module.cc \
+ Module.h \
+ Parser.cc \
+ Parser.h \
+ Segment.cc \
+ Segment.h \
+ Sequence.cc \
+ Sequence.h \
+ Var.h \
+ VarState.cc \
+ VarState.h
+
+INCLUDES += \
+ -I$(top_srcdir)/lib/libTrie/include \
+ -I$(top_builddir)/lib/libTrie/include
+
=== added file 'src/esi/Module.cc'
--- src/esi/Module.cc 1970-01-01 00:00:00 +0000
+++ src/esi/Module.cc 2009-03-17 15:27:56 +0000
@@ -0,0 +1,28 @@
+#include "squid.h"
+#include "esi/Module.h"
+#include "esi/CustomParser.h"
+#include "esi/Libxml2Parser.h"
+#include "esi/ExpatParser.h" /* must follow esi/Libxml2Parser.h */
+
+static ESIParser::Register *prCustom = 0;
+static ESIParser::Register *prLibxml = 0;
+static ESIParser::Register *prExpat = 0;
+
+void Esi::Init() {
+ assert(!prCustom); // we should be called once
+ prCustom = new ESIParser::Register("custom", &ESICustomParser::NewParser);
+ prLibxml = new ESIParser::Register("libxml2", &ESILibxml2Parser::NewParser);
+ prExpat = new ESIParser::Register("expat", &ESIExpatParser::NewParser);
+}
+
+void Esi::Clean() {
+ assert(prCustom); // we should be called once, and only after Init()
+
+ delete prExpat;
+ delete prLibxml;
+ delete prCustom;
+
+ prExpat = NULL;
+ prLibxml = NULL;
+ prCustom = NULL;
+}
=== added file 'src/esi/Module.h'
--- src/esi/Module.h 1970-01-01 00:00:00 +0000
+++ src/esi/Module.h 2009-03-17 15:27:56 +0000
@@ -0,0 +1,11 @@
+#ifndef SQUID_ESI_MODULE_H
+#define SQUID_ESI_MODULE_H
+
+namespace Esi {
+
+ extern void Init();
+ extern void Clean();
+
+}; // namespace Esi
+
+#endif /* SQUID_ESI_MODULE_H */
=== renamed file 'src/ESIParser.cc' => 'src/esi/Parser.cc'
--- src/ESIParser.cc 2009-01-21 03:47:47 +0000
+++ src/esi/Parser.cc 2009-03-17 15:24:36 +0000
@@ -33,7 +33,7 @@
*/
#include "squid.h"
-#include "ESIParser.h"
+#include "esi/Parser.h"
char *ESIParser::Type = NULL;
ESIParser::Register *ESIParser::Parsers = NULL;
@@ -54,3 +54,14 @@
return (Parser->newParser)(aClient);
}
+
+ESIParser::Register::Register(const char *_name, ESIParser::Pointer (*_newParser)(ESIParserClient *aClient)) : name(_name), newParser(_newParser) {
+ this->next = ESIParser::Parsers;
+ ESIParser::Parsers = this;
+}
+
+ESIParser::Register::~Register() {
+ // TODO: support random-order deregistration
+ assert(ESIParser::Parsers == this);
+ ESIParser::Parsers = next;
+}
=== renamed file 'src/ESIParser.h' => 'src/esi/Parser.h'
--- src/ESIParser.h 2009-01-21 03:47:47 +0000
+++ src/esi/Parser.h 2009-03-17 15:24:36 +0000
@@ -52,6 +52,7 @@
class ESIParser : public RefCountable
{
public:
+ class Register;
typedef RefCount<ESIParser> Pointer;
static void registerParser(const char *name, Pointer (*new_func)(ESIParserClient *aClient));
@@ -70,8 +71,6 @@
protected:
ESIParser() {};
- class Register;
-
private:
static Register *Parser;
static Register *Parsers;
@@ -83,26 +82,21 @@
{
public:
- Register(const char *_name, ESIParser::Pointer (*_newParser)(ESIParserClient *aClient)) : name(_name), newParser(_newParser) {
- this->next = ESIParser::Parsers;
- ESIParser::Parsers = this;
- }
+ Register(const char *_name, ESIParser::Pointer (*_newParser)(ESIParserClient *aClient));
+ ~Register();
const char *name;
ESIParser::Pointer (*newParser)(ESIParserClient *aClient);
Register * next;
};
-#define RegisterESIParser(name, ThisClass) \
- ESIParser::Register ThisClass::thisParser(name, &NewParser); \
+#define EsiParserDefinition(ThisClass) \
ESIParser::Pointer ThisClass::NewParser(ESIParserClient *aClient) \
{ \
return new ThisClass (aClient); \
}
-#define ESI_PARSER_TYPE \
- static ESIParser::Pointer NewParser(ESIParserClient *aClient); \
- static ESIParser::Register thisParser
-
+#define EsiParserDeclaration \
+ static ESIParser::Pointer NewParser(ESIParserClient *aClient)
#endif /* SQUID_ESIPARSER_H */
=== renamed file 'src/ESISegment.cc' => 'src/esi/Segment.cc'
--- src/ESISegment.cc 2009-02-06 00:59:06 +0000
+++ src/esi/Segment.cc 2009-03-10 20:52:45 +0000
@@ -34,7 +34,7 @@
*/
#include "squid.h"
-#include "ESISegment.h"
+#include "esi/Segment.h"
#include "SquidString.h"
CBDATA_TYPE(ESISegment);
=== renamed file 'src/ESISegment.h' => 'src/esi/Segment.h'
=== renamed file 'src/ESISequence.cc' => 'src/esi/Sequence.cc'
--- src/ESISequence.cc 2009-01-21 03:47:47 +0000
+++ src/esi/Sequence.cc 2009-03-10 20:52:45 +0000
@@ -40,10 +40,10 @@
*/
#if (USE_SQUID_ESI == 1)
-#include "ESISequence.h"
-#include "ESILiteral.h"
-#include "ESIAttempt.h"
-#include "ESIExcept.h"
+#include "esi/Sequence.h"
+#include "esi/Literal.h"
+#include "esi/Attempt.h"
+#include "esi/Except.h"
class esiExcept;
=== renamed file 'src/ESISequence.h' => 'src/esi/Sequence.h'
--- src/ESISequence.h 2009-01-21 03:47:47 +0000
+++ src/esi/Sequence.h 2009-03-10 20:52:45 +0000
@@ -37,8 +37,8 @@
#define SQUID_ESISEQUENCE_H
#include "squid.h"
-#include "ESIElement.h"
-#include "ElementList.h"
+#include "esi/Element.h"
+#include "esi/ElementList.h"
/* esiSequence */
=== renamed file 'src/ESIVar.h' => 'src/esi/Var.h'
--- src/ESIVar.h 2009-01-21 03:47:47 +0000
+++ src/esi/Var.h 2009-03-10 20:52:45 +0000
@@ -37,8 +37,8 @@
#define SQUID_ESIVAR_H
#include "squid.h"
-#include "ESIElement.h"
-#include "ESISequence.h"
+#include "esi/Element.h"
+#include "esi/Sequence.h"
/* esiVar */
=== renamed file 'src/ESIVarState.cc' => 'src/esi/VarState.cc'
--- src/ESIVarState.cc 2009-01-31 16:05:18 +0000
+++ src/esi/VarState.cc 2009-03-10 20:52:45 +0000
@@ -35,7 +35,7 @@
*/
#include "squid.h"
-#include "ESIVarState.h"
+#include "esi/VarState.h"
#include "HttpReply.h"
CBDATA_TYPE (ESIVarState);
=== renamed file 'src/ESIVarState.h' => 'src/esi/VarState.h'
--- src/ESIVarState.h 2009-01-21 03:47:47 +0000
+++ src/esi/VarState.h 2009-03-10 20:52:45 +0000
@@ -34,7 +34,7 @@
#ifndef SQUID_ESIVARSTATE_H
#define SQUID_ESIVARSTATE_H
-#include "ESISegment.h"
+#include "esi/Segment.h"
#include "Trie.h"
#include "Array.h"
#include "HttpHeader.h"
=== modified file 'src/main.cc'
--- src/main.cc 2009-03-08 19:34:36 +0000
+++ src/main.cc 2009-03-17 16:57:05 +0000
@@ -86,6 +86,10 @@
#include "adaptation/Config.h"
#endif
+#if USE_SQUID_ESI
+#include "esi/Module.h"
+#endif
+
#if USE_WIN32_SERVICE
#include "squid_windows.h"
@@ -1061,6 +1065,9 @@
Adaptation::Config::Finalize(enableAdaptation);
#endif
+#if USE_SQUID_ESI
+ Esi::Init();
+#endif
debugs(1, 1, "Ready to serve requests.");
@@ -1671,6 +1678,11 @@
releaseServerSockets();
commCloseAllSockets();
+
+#if USE_SQUID_ESI
+ Esi::Clean();
+#endif
+
#if DELAY_POOLS
DelayPools::FreePools();
=== modified file 'test-suite/ESIExpressions.cc'
--- test-suite/ESIExpressions.cc 2009-01-21 03:47:47 +0000
+++ test-suite/ESIExpressions.cc 2009-03-10 20:52:45 +0000
@@ -34,7 +34,7 @@
*/
#include "squid.h"
-#include "ESIExpression.h"
+#include "esi/Expression.h"
int
main ()
=== modified file 'test-suite/Makefile.am'
--- test-suite/Makefile.am 2009-02-18 00:18:43 +0000
+++ test-suite/Makefile.am 2009-03-10 20:52:45 +0000
@@ -66,7 +66,7 @@
DEBUG_SOURCE = test_tools.cc
debug_SOURCES = debug.cc $(DEBUG_SOURCE)
ESIExpressions_SOURCES = ESIExpressions.cc $(DEBUG_SOURCE)
-ESIExpressions_LDADD = $(top_builddir)/src/ESIExpression.o \
+ESIExpressions_LDADD = $(top_builddir)/src/esi/Expression.o \
$(LDADD)
mem_node_test_SOURCES = mem_node_test.cc
mem_node_test_LDADD = $(top_builddir)/src/mem_node.o $(LDADD)
# Begin bundle
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
V+h5Bxr7Cn3d3/i7kinChIbr98Tg