richter 01/11/15 04:09:03
Modified: . Tag: Embperl2c Embperl.pm embperl.h ep2.h epmain.c
epprovider.c
Embperl Tag: Embperl2c Recipe.pm
Embperl/Recipe Tag: Embperl2c Embperl.pm
driver Tag: Embperl2c epxalan.cpp
Log:
Embperl 2 - recipe updates
Revision Changes Path
No revision
No revision
1.118.4.59 +2 -1 embperl/Embperl.pm
Index: Embperl.pm
===================================================================
RCS file: /home/cvs/embperl/Embperl.pm,v
retrieving revision 1.118.4.58
retrieving revision 1.118.4.59
diff -u -r1.118.4.58 -r1.118.4.59
--- Embperl.pm 2001/11/08 13:14:02 1.118.4.58
+++ Embperl.pm 2001/11/15 12:09:02 1.118.4.59
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: Embperl.pm,v 1.118.4.58 2001/11/08 13:14:02 richter Exp $
+# $Id: Embperl.pm,v 1.118.4.59 2001/11/15 12:09:02 richter Exp $
#
###################################################################################
@@ -26,6 +26,7 @@
##ep2##
use HTML::Embperl::Syntax ;
+use HTML::Embperl::Recipe ;
##/ep2##
use strict ;
1.19.4.14 +3 -2 embperl/embperl.h
Index: embperl.h
===================================================================
RCS file: /home/cvs/embperl/embperl.h,v
retrieving revision 1.19.4.13
retrieving revision 1.19.4.14
diff -u -r1.19.4.13 -r1.19.4.14
--- embperl.h 2001/11/07 15:21:59 1.19.4.13
+++ embperl.h 2001/11/15 12:09:02 1.19.4.14
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: embperl.h,v 1.19.4.13 2001/11/07 15:21:59 richter Exp $
+# $Id: embperl.h,v 1.19.4.14 2001/11/15 12:09:02 richter Exp $
#
###################################################################################*/
@@ -81,7 +81,8 @@
rcUnknownProvider,
rcXalanError,
rcMissingParam,
- rcNotCodeRef
+ rcNotCodeRef,
+ rcUnknownRecipe
} ;
1.1.2.22 +20 -2 embperl/Attic/ep2.h
Index: ep2.h
===================================================================
RCS file: /home/cvs/embperl/Attic/ep2.h,v
retrieving revision 1.1.2.21
retrieving revision 1.1.2.22
diff -u -r1.1.2.21 -r1.1.2.22
--- ep2.h 2001/11/10 15:21:28 1.1.2.21
+++ ep2.h 2001/11/15 12:09:02 1.1.2.22
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: ep2.h,v 1.1.2.21 2001/11/10 15:21:28 richter Exp $
+# $Id: ep2.h,v 1.1.2.22 2001/11/15 12:09:02 richter Exp $
#
###################################################################################*/
@@ -259,7 +259,25 @@
int Provider_Init (void) ;
-
+int Provider_New (/*in*/ req * r,
+ /*in*/ size_t nSize,
+ /*in*/ tCacheItem * pItem,
+ /*in*/ tProviderClass * pProviderClass,
+ /*in*/ HV * pParam) ;
+
+int Provider_NewDependOne (/*in*/ req * r,
+ /*in*/ size_t nSize,
+ /*in*/ const char * sSourceName,
+ /*in*/ tCacheItem * pItem,
+ /*in*/ tProviderClass * pProviderClass,
+ /*in*/ HV * pParam) ;
+
+int Provider_AddDependOne (/*in*/ req * r,
+ /*in*/ tProvider * pProvider,
+ /*in*/ const char * sSourceName,
+ /*in*/ tCacheItem * pItem,
+ /*in*/ tProviderClass * pProviderClass,
+ /*in*/ HV * pParam) ;
1.75.4.69 +22 -10 embperl/epmain.c
Index: epmain.c
===================================================================
RCS file: /home/cvs/embperl/epmain.c,v
retrieving revision 1.75.4.68
retrieving revision 1.75.4.69
diff -u -r1.75.4.68 -r1.75.4.69
--- epmain.c 2001/11/15 08:32:52 1.75.4.68
+++ epmain.c 2001/11/15 12:09:02 1.75.4.69
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: epmain.c,v 1.75.4.68 2001/11/15 08:32:52 richter Exp $
+# $Id: epmain.c,v 1.75.4.69 2001/11/15 12:09:02 richter Exp $
#
###################################################################################*/
@@ -155,6 +155,7 @@
case rcXalanError: msg ="[%d]ERR: %d: %s Xalan Error: %s: %s" ;
break ;
case rcMissingParam: msg ="[%d]ERR: %d: %s Missing Parameter %s
%s" ; break ;
case rcNotCodeRef: msg ="[%d]ERR: %d: %s %s need coderef in
'%s'" ; break ;
+ case rcUnknownRecipe: msg ="[%d]ERR: %d: %s Unknown recipe
'%s'" ; break ;
default: msg ="[%d]ERR: %d: %s Error %s%s" ; break ;
}
@@ -3366,6 +3367,7 @@
{
int rc ;
+
r -> Buf.pSourcelinePos = r -> Buf.pCurrPos = r -> Buf.pBuf ;
r -> Buf.pEndPos = r -> Buf.pBuf + nFileSize ;
@@ -3408,12 +3410,22 @@
int i ;
char * s ;
SV * c ;
+ SV * pRecipe ;
+ STRLEN l ;
+ int num ;
-#if 0
- if ((pRecipe = GetHashValueSV (pRP, "recipe")))
- {
- PUSHMARK(sp);
- XPUSHs(sv_2mortal(newRV_inc(pRP)));
+ dSP ;
+
+ if (GetHashValueSV (pRP, "provider"))
+ pParam = r -> pConf -> pReqParameter ;
+ else
+ {
+ if (!(pRecipe = GetHashValueSV (pRP, "recipe")))
+ pRecipe = sv_2mortal(newSVpv ("Embperl", 7)) ;
+
+ PUSHMARK(sp);
+ XPUSHs(r -> pReqSV);
+ XPUSHs(sv_2mortal(newRV_inc((SV *)pRP)));
XPUSHs(pRecipe);
PUTBACK;
num = perl_call_pv ("HTML::Embperl::Recipe::GetRecipe", G_SCALAR /*|
G_EVAL*/) ;
@@ -3422,14 +3434,13 @@
if (num == 1)
pParamRV = POPs ;
PUTBACK;
- if (num != 1 || !SvROK (pParamRV) || !(pParam = SvRV(pParamRV)) ||
SvTYPE(pParam) != SVt_PVHV)
+ if (num != 1 || !SvROK (pParamRV) || !(pParam = (HV *)SvRV(pParamRV)) ||
SvTYPE((SV *)pParam) != SVt_PVHV)
{
strncpy (r -> errdat1, SvPV(pRecipe, l), sizeof (r -> errdat1) - 1) ;
- return rcUnknowRecipe ;
+ return rcUnknownRecipe ;
}
}
- else
-#endif
+#if 0
if (GetHashValueSV (pRP, "provider"))
pParam = r -> pConf -> pReqParameter ;
else
@@ -3503,6 +3514,7 @@
if (r -> pImportStash)
pParam = (HV *)SvRV(pImportParam) ;
+#endif
if (SvTYPE(pParam) != SVt_PVHV)
1.1.2.11 +136 -15 embperl/Attic/epprovider.c
Index: epprovider.c
===================================================================
RCS file: /home/cvs/embperl/Attic/epprovider.c,v
retrieving revision 1.1.2.10
retrieving revision 1.1.2.11
diff -u -r1.1.2.10 -r1.1.2.11
--- epprovider.c 2001/11/14 09:30:30 1.1.2.10
+++ epprovider.c 2001/11/15 12:09:02 1.1.2.11
@@ -9,7 +9,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: epprovider.c,v 1.1.2.10 2001/11/14 09:30:30 richter Exp $
+# $Id: epprovider.c,v 1.1.2.11 2001/11/15 12:09:02 richter Exp $
#
###################################################################################*/
@@ -83,11 +83,11 @@
/* ------------------------------------------------------------------------ */
/* */
-/* Provider_NewDependOne */
+/* Provider_AddDependOne */
/* */
/*!
* \_en
-* Creates a provider which depends on another provider. If only a string
+* Adds another dependency provider to a new provider. If only a string
* is given for the dependend provider the fMatch functions of the
* provider classes are called until a provider class is found.
*
@@ -105,7 +105,7 @@
* \endif
*
* \_de
-* Erzeugt einen neuen Provider der von einem anderem Provider abh�ngt.
+* F�gt einen neuen Abh�nigkeit f�r einen neuen Provider.
* Wird nur eine Zeichenkette als Abh�nigkeit �bergeben, werden der Reihe
* nach die fMatch Funktionen der Providerklassen aufgerufen, bis eine
* passende Klasse gefunden wurde.
@@ -126,8 +126,8 @@
*
* ------------------------------------------------------------------------ */
-int Provider_NewDependOne (/*in*/ req * r,
- /*in*/ size_t nSize,
+int Provider_AddDependOne (/*in*/ req * r,
+ /*in*/ tProvider * pProvider,
/*in*/ const char * sSourceName,
/*in*/ tCacheItem * pItem,
/*in*/ tProviderClass * pProviderClass,
@@ -138,12 +138,9 @@
int rc ;
HV * pSourceParam ;
char * sSource ;
- tProvider * pProvider ;
+
tCacheItem * pSubCache ;
- if ((rc = Provider_New (r, nSize, pItem, pProviderClass, pParam)) != ok)
- return rc ;
-
GetHashValueStrOrHash (pParam, sSourceName, &sSource, &pSourceParam) ;
if (sSource)
@@ -176,7 +173,72 @@
return ok ;
}
+/* ------------------------------------------------------------------------ */
+/* */
+/* Provider_NewDependOne */
+/* */
+/*!
+* \_en
+* Creates a provider which depends on another provider. If only a string
+* is given for the dependend provider the fMatch functions of the
+* provider classes are called until a provider class is found.
+*
+* @note This function should not be called directly, but from another
+* ProviderXXX_New function
+*
+* @param r Embperl request record
+* @param nSize Size of provider struct
+* @param sSourceName Name of the element in pParam that holds the source
+* @param pItem CacheItem which holds the output of the provider
+* @param pProviderClass Provider class record
+* source Sourcetext provider
+* @param pParam Parameter Hash
+* @return error code
+* \endif
+*
+* \_de
+* Erzeugt einen neuen Provider der von einem anderem Provider abh�ngt.
+* Wird nur eine Zeichenkette als Abh�nigkeit �bergeben, werden der Reihe
+* nach die fMatch Funktionen der Providerklassen aufgerufen, bis eine
+* passende Klasse gefunden wurde.
+*
+* @note Diese Funktion sollte nicht direkt aufgerufen werden, sondern
+* von einer anderen ProviderXXX_New Funktion aus
+*
+* @param r Embperl request record
+* @param nSize Gr��er der provider struct
+* @param sSourceName Name des Elements in pParam welches die Quelle enth�lt
+* @param pItem CacheItem welches die Ausgabe des Providers
+* speichert
+* @param pProviderClass Provider class record
+* @param pParam Parameter Hash
+* source Quellentext provider
+* @return Fehlercode
+* \endif
+*
+* ------------------------------------------------------------------------ */
+
+int Provider_NewDependOne (/*in*/ req * r,
+ /*in*/ size_t nSize,
+ /*in*/ const char * sSourceName,
+ /*in*/ tCacheItem * pItem,
+ /*in*/ tProviderClass * pProviderClass,
+ /*in*/ HV * pParam)
+
+
+ {
+ int rc ;
+
+ if ((rc = Provider_New (r, nSize, pItem, pProviderClass, pParam)) != ok)
+ return rc ;
+ if ((rc = Provider_AddDependOne (r, pItem -> pProvider, sSourceName, pItem,
pProviderClass, pParam)) != ok)
+ return rc ;
+
+ return ok ;
+ }
+
+
/* ------------------------------------------------------------------------ */
@@ -232,13 +294,29 @@
{
int rc ;
tProviderFile * pNew ;
+ const char * sFilename ;
+ const char * sFn = NULL ;
if ((rc = Provider_New (r, sizeof(tProviderFile), pItem, pProviderClass,
pParam)) != ok)
return rc ;
pNew = (tProviderFile *)pItem -> pProvider ;
+
+ sFilename = GetHashValueStr (pParam, "filename", "") ;
+ if ((r -> bOptions & optDisableChdir) == 0)
+ {
+ sFn = strrchr (sFilename, '/') ;
+#ifdef WIN32
+ if (!sFn)
+ sFn = strrchr (sFilename, '\\') ;
+#endif
+ }
+ if (sFn)
+ sFn++ ;
+ else
+ sFn = sFilename ;
- pNew -> sFilename = GetHashValueStrDup (pParam, "filename",
NULL) ;
+ pNew -> sFilename = strdup (sFn) ;
pItem -> sExpiresFilename = strdup (pNew -> sFilename) ;
return ok ;
@@ -285,6 +363,7 @@
/*i/o*/ SV * pKey)
{
const char * sFilename = GetHashValueStr (pParam, "filename", "") ;
+ const char * sFn = NULL ;
const char * sDir = "" ;
/* is it a relative filename? -> append path */
@@ -297,10 +376,23 @@
#endif
))
{
+ if ((r -> bOptions & optDisableChdir) == 0)
+ {
+ sFn = strrchr (sFilename, '/') ;
+#ifdef WIN32
+ if (!sFn)
+ sFn = strrchr (sFilename, '\\') ;
+#endif
+ }
sDir = r -> sCWD ;
}
- sv_catpvf (pKey, "*file:%s%s%s", sDir, *sDir?"/":"", sFilename) ;
+ if (sFn)
+ sFn++ ;
+ else
+ sFn = sFilename ;
+
+ sv_catpvf (pKey, "*file:%s%s%s", sDir, *sDir?"/":"", sFn) ;
return ok ;
}
@@ -423,6 +515,7 @@
{
int rc ;
tProviderMem * pNew ;
+ SV * pSrc ;
if ((rc = Provider_New (r, sizeof(tProviderMem), pItem, pProviderClass,
pParam)) != ok)
return rc ;
@@ -430,9 +523,16 @@
pNew = (tProviderMem *)pItem -> pProvider ;
pNew -> sName = GetHashValueStrDup (pParam, "name", NULL) ;
- pNew -> pSource = GetHashValueSVinc (pParam, "source",
NULL) ;
pNew -> nLastModified = GetHashValueUInt (pParam, "mtime", 0) ;
+ pSrc = GetHashValueSV (pParam, "source") ;
+ if (!pSrc)
+ pNew -> pSource = NULL ;
+ else if (SvROK(pSrc))
+ pNew -> pSource = SvREFCNT_inc (SvRV(pSrc)) ;
+ else
+ pNew -> pSource = SvREFCNT_inc (pSrc) ;
+
lprintf (r, "mem_new provider=%x source=%x\n", pNew, pNew -> pSource) ;
return ok ;
}
@@ -518,12 +618,21 @@
/*in*/ tProvider * pProvider,
/*in*/ HV * pParam)
{
+ SV * pSrc ;
+
if (((tProviderMem *)pProvider) -> pSource)
SvREFCNT_dec (((tProviderMem *)pProvider) -> pSource) ;
- ((tProviderMem *)pProvider) -> pSource = GetHashValueSVinc
(pParam, "source", NULL) ;
((tProviderMem *)pProvider) -> nLastModified = GetHashValueUInt
(pParam, "mtime", 0) ;
+ pSrc = GetHashValueSV (pParam, "source") ;
+ if (!pSrc)
+ ((tProviderMem *)pProvider) -> pSource = NULL ;
+ else if (SvROK(pSrc))
+ ((tProviderMem *)pProvider) -> pSource = SvREFCNT_inc (SvRV(pSrc)) ;
+ else
+ ((tProviderMem *)pProvider) -> pSource = SvREFCNT_inc (pSrc) ;
+
return ok ;
}
@@ -1579,12 +1688,24 @@
STRLEN len ;
tIndex xSrcDomTree ;
tCacheItem * pSrcCache ;
+ SV * pOut ;
+ char * pBuf ;
+
pSrcCache = Cache_GetDependency(r, pProvider -> pCache, 0) ;
if ((rc = Cache_GetContentIndex (r, pSrcCache, &xSrcDomTree)) != ok)
return rc ;
- mydie ("Not implemented yet") ;
+ pOut = newSV (1) ;
+ len = GetContentLength (r) + 1 ;
+
+ SvGROW (pOut, len) ;
+ pBuf = SvPVX (pOut) ;
+ oCommitToMem (r, NULL, pBuf) ;
+ oRollbackOutput (r, NULL) ;
+ SvCUR_set (pOut, len - 1) ;
+
+ *pData = pOut ;
return ok ;
}
No revision
No revision
1.1.2.4 +9 -9 embperl/Embperl/Attic/Recipe.pm
Index: Recipe.pm
===================================================================
RCS file: /home/cvs/embperl/Embperl/Attic/Recipe.pm,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -r1.1.2.3 -r1.1.2.4
--- Recipe.pm 2001/11/14 15:01:42 1.1.2.3
+++ Recipe.pm 2001/11/15 12:09:03 1.1.2.4
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: Recipe.pm,v 1.1.2.3 2001/11/14 15:01:42 richter Exp $
+# $Id: Recipe.pm,v 1.1.2.4 2001/11/15 12:09:03 richter Exp $
#
###################################################################################
@@ -32,18 +32,18 @@
sub GetRecipe
{
- my ($param, $name) = @_ ;
+ my ($r, $param, $name) = @_ ;
my @names = split (/\s/, $name) ;
-
-no strict ;
- foreach $recipe (@names)
+ @names = ('Embperl') if (!@names) ;
+
+ foreach my $recipe (@names)
{
my $mod ;
if (!($mod = $Recipes{$recipe}))
{
my $mod = ($name =~ /::/)?$recipe:'HTML::Embperl::Recipe::'. $recipe ;
- if (!defined (&{$mod . '::new}))
+ if (!defined (&{$mod . '::new'}))
{
eval "require $mod" ;
if ($@)
@@ -52,13 +52,11 @@
return undef ;
}
}
- }
- my $obj = $mod -> new ($recipe, $param) ;
+ my $obj = $mod -> new ($r, $recipe, $param) ;
return $obj if ($obj) ;
}
}
-use strict ;
return undef ;
}
@@ -80,3 +78,5 @@
return HTML::Embperl::Execute ({recipe => $self}) ;
}
+
+1;
\ No newline at end of file
No revision
No revision
1.1.2.2 +38 -23 embperl/Embperl/Recipe/Attic/Embperl.pm
Index: Embperl.pm
===================================================================
RCS file: /home/cvs/embperl/Embperl/Recipe/Attic/Embperl.pm,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- Embperl.pm 2001/11/14 15:01:42 1.1.2.1
+++ Embperl.pm 2001/11/15 12:09:03 1.1.2.2
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: Embperl.pm,v 1.1.2.1 2001/11/14 15:01:42 richter Exp $
+# $Id: Embperl.pm,v 1.1.2.2 2001/11/15 12:09:03 richter Exp $
#
###################################################################################
@@ -19,8 +19,9 @@
package HTML::Embperl::Recipe::Embperl ;
use strict ;
-use vars qw{@ISA @EXPORT_OK %EXPORT_TAGS} ;
+use vars qw{@ISA} ;
+@ISA = ('HTML::Embperl::Recipe') ;
# ---------------------------------------------------------------------------------
#
@@ -32,9 +33,12 @@
sub new
{
- my ($class, $recipe, $param) = @_ ;
+ my ($class, $r, $recipe, $param) = @_ ;
+ my $self ;
my $src ;
+ my $file = $param -> {inputfile} ;
+ $file = $r -> Sourcefile if (!$file || $file eq '*') ;
if (ref $param -> {input})
{
@@ -51,45 +55,56 @@
$src =
{
'type' => 'file',
- 'filename' => $param -> {inputfile},
- 'cache', => 0,
+ 'filename' => $file,
+ 'cache' => 0,
} ;
}
- my $self =
+ my $import =
{
- 'provider', =>
+ 'provider' =>
{
- 'type' => 'eprun',
+ 'type' => 'epcompile',
'source' =>
{
+ 'cache', => 0,
'provider' =>
{
- 'type' => 'epcompile',
+ 'type' => 'epparse',
+ 'syntax' => $param -> {'syntax'} || 'Embperl',
'source' =>
{
- 'cache', => 0,
- 'provider' =>
- {
- 'type' => 'epparse',
- 'syntax' => $param -> {'syntax'} || 'Embperl',
- 'source' =>
- {
- 'cache' => 0,
- 'provider' => $src,
- }
- }
+ 'cache' => 0,
+ 'provider' => $src,
}
}
}
}
} ;
- foreach (qw{expires_in expires_func expires_filename})
+ if (!exists $param -> {'import'})
{
- $self -> {$_} = $param -> {$_} if (exists $param -> {$_}) ;
+ my $run =
+ {
+ 'provider' =>
+ {
+ 'type' => 'eprun',
+ 'source' => $import
+ }
+ } ;
+
+
+ foreach (qw{expires_in expires_func expires_filename cache_key
cache_key_options cache_key_func})
+ {
+ $run -> {$_} = $param -> {$_} if (exists $param -> {$_}) ;
+ }
+ $run -> {'cache'} = $run -> {expires_in} || $run -> {expires_func} || $run
-> {expires_filename}?1:0 ;
+ $self = $run ;
+ }
+ else
+ {
+ $self = $import ;
}
- $self -> {'cache'} = 0 ;
return $self ;
}
No revision
No revision
1.1.2.10 +291 -67 embperl/driver/Attic/epxalan.cpp
Index: epxalan.cpp
===================================================================
RCS file: /home/cvs/embperl/driver/Attic/epxalan.cpp,v
retrieving revision 1.1.2.9
retrieving revision 1.1.2.10
diff -u -r1.1.2.9 -r1.1.2.10
--- epxalan.cpp 2001/11/08 16:42:25 1.1.2.9
+++ epxalan.cpp 2001/11/15 12:09:03 1.1.2.10
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: epxalan.cpp,v 1.1.2.9 2001/11/08 16:42:25 richter Exp $
+# $Id: epxalan.cpp,v 1.1.2.10 2001/11/15 12:09:03 richter Exp $
#
###################################################################################*/
@@ -92,7 +92,7 @@
*
* ------------------------------------------------------------------------ */
-int ProviderXalanXSL_New (/*in*/ req * r,
+static int ProviderXalanXSL_New (/*in*/ req * r,
/*in*/ tCacheItem * pItem,
/*in*/ tProviderClass * pProviderClass,
/*in*/ HV * pParam)
@@ -100,51 +100,9 @@
{
int rc ;
- HV * pStylesheetParam ;
- char * sStylesheet ;
- tProviderXalanXSL * pNew = (tProviderXalanXSL *)cache_malloc (r,
sizeof(tProviderXalanXSL)) ;
- if (!pNew)
- return rcOutOfMemory ;
-
- memset (pNew, 0, sizeof (*pNew)) ;
-
- pNew -> Provider.pCache = pItem ;
- pNew -> Provider.pProviderClass = pProviderClass ;
- pNew -> Provider.sOutputType = pProviderClass -> sOutputType ;
-
- GetHashValueStrOrHash (pParam, "stylesheet", &sStylesheet, &pStylesheetParam) ;
-
- tCacheItem * pFileCache ;
- if (sStylesheet)
- {
- pStylesheetParam = (HV *)SvRV(sv_2mortal (CreateHashRef (
- "provider", hashtsv, CreateHashRef (
- "type", hashtstr, "file",
- "filename", hashtstr, sStylesheet,
- NULL),
- "cache", hashtint, 0,
- NULL))) ;
- }
-
- if (pStylesheetParam)
- {
- if ((rc = Cache_New (r, pStylesheetParam, &pFileCache)) != ok)
- return rc ;
-
- if ((rc = Cache_AddDependency (r, pItem, pFileCache)) != ok)
- return rc ;
-
- }
- else
- {
- strcpy (r -> errdat1, "Xalan-XSL") ;
- strcpy (r -> errdat2, "stylesheet") ;
- return rcMissingParam ;
- }
-
-
- pItem -> pProvider = (tProvider *)pNew ;
+ if ((rc = Provider_NewDependOne (r, sizeof(tProviderXalanXSL), "stylesheet",
pItem, pProviderClass, pParam)) != ok)
+ return rc ;
return ok ;
}
@@ -191,7 +149,7 @@
if ((rc = Cache_AppendKey (r, pParam, "stylesheet", pKey)) != ok)
return rc;
- sv_catpv (pKey, "*xalan-cxsl") ;
+ sv_catpv (pKey, "*xalan-compile-xsl") ;
return ok ;
}
@@ -225,7 +183,7 @@
-int ProviderXalanXSL_GetContentPtr (/*in*/ req * r,
+static int ProviderXalanXSL_GetContentPtr (/*in*/ req * r,
/*in*/ tProvider * pProvider,
/*in*/ void * * pData)
@@ -284,7 +242,7 @@
-int ProviderXalanXSL_FreeContent(/*in*/ req * r,
+static int ProviderXalanXSL_FreeContent(/*in*/ req * r,
/*in*/ tCacheItem * pItem)
{
@@ -297,7 +255,7 @@
/* ------------------------------------------------------------------------ */
-tProviderClass ProviderClassXalanXSL =
+static tProviderClass ProviderClassXalanXSL =
{
"text/*",
&ProviderXalanXSL_New,
@@ -328,23 +286,7 @@
return owrite ((tReq *)context, buffer, len) ;
}
-/* ------------------------------------------------------------------------ */
-int embperl_Xalan_Init ()
- {
- Cache_AddProviderClass ("xalan-cxsl", &ProviderClassXalanXSL) ;
-
- // Call the static initializer for Xerces.
- XMLPlatformUtils::Initialize();
-
- // Initialize Xalan.
- XalanTransformer::initialize();
-
-
- theXalanTransformer = new XalanTransformer ;
- }
-
-
/* ------------------------------------------------------------------------ */
/* */
/* embperl_Xalan_Text2Text */
@@ -442,7 +384,7 @@
pStylesheetParam = sv_2mortal (CreateHashRef (
"provider", hashtsv, CreateHashRef (
- "type", hashtstr, "xalan-cxsl",
+ "type", hashtstr, "xalan-compile-xsl",
"stylesheet", hashtsv, CreateHashRef (
"provider", hashtsv, CreateHashRef (
"type", hashtstr, "file",
@@ -495,6 +437,288 @@
return(0);
}
+
+
+/*! Provider that reads compiles xalan stylesheet */
+
+typedef struct tProviderXalan
+ {
+ tProvider Provider ;
+ SV * pOutputSV ;
+ } tProviderXalan ;
+
+
+/* ------------------------------------------------------------------------ */
+/* */
+/* ProviderXalan_New */
+/* */
+/*!
+* \_en
+* Creates a new xalan provider and fills it with data from the hash pParam
+* The resulting provider is put into the cache structure
+*
+* @param r Embperl request record
+* @param pItem CacheItem which holds the output of the provider
+* @param pProviderClass Provider class record
+* @param pParam Parameter Hash
+* stylesheet filename or provider for the
+* stylesheet
+* @return error code
+* \endif
+*
+* \_de
+* Erzeugt einen neue Provider f�r Xalan. Der ein Zeiger
+* auf den resultierenden Provider wird in die Cachestrutr eingef�gt
+*
+* @param r Embperl request record
+* @param pItem CacheItem welches die Ausgabe des Providers
+* speichert
+* @param pProviderClass Provider class record
+* @param pParam Parameter Hash
+* stylesheet dateiname oder provider f�r das
+* stylesheet
+* @return Fehlercode
+* \endif
+*
+* ------------------------------------------------------------------------ */
+
+int ProviderXalan_New (/*in*/ req * r,
+ /*in*/ tCacheItem * pItem,
+ /*in*/ tProviderClass * pProviderClass,
+ /*in*/ HV * pParam)
+
+
+ {
+ int rc ;
+
+ if ((rc = Provider_NewDependOne (r, sizeof(tProviderXalan), "source", pItem,
pProviderClass, pParam)) != ok)
+ return rc ;
+
+ if ((rc = Provider_AddDependOne (r, pItem -> pProvider, "stylesheet", pItem,
pProviderClass, pParam)) != ok)
+ return rc ;
+
+ return ok ;
+ }
+
+/* ------------------------------------------------------------------------ */
+/* */
+/* ProviderFile_AppendKey */
+/* */
+/*!
+* \_en
+* Append it's key to the keystring. If it depends on anything it must
+* call Cache_AppendKey for any dependency.
+*
+* @param r Embperl request record
+* @param pProviderClass Provider class record
+* @param pParam Parameter Hash
+* filename name of file
+* @param pKey Key to which string should be appended
+* @return error code
+* \endif
+*
+* \_de
+* H�ngt ein eigenen Schl�ssel an den Schl�sselstring an. Wenn irgednwelche
+* Abh�nigkeiten bestehen, mu� Cache_AppendKey f�r alle Abh�nigkeiten aufgerufen
+* werden.
+*
+* @param r Embperl request record
+* @param pProviderClass Provider class record
+* @param pParam Parameter Hash
+* filename Dateiname
+* @param pKey Schl�ssel zu welchem hinzugef�gt wird
+* @return Fehlercode
+* \endif
+*
+* ------------------------------------------------------------------------ */
+
+static int ProviderXalan_AppendKey (/*in*/ req * r,
+ /*in*/ tProviderClass * pProviderClass,
+ /*in*/ HV * pParam,
+ /*i/o*/ SV * pKey)
+ {
+ int rc ;
+
+ if ((rc = Cache_AppendKey (r, pParam, "source", pKey)) != ok)
+ return rc;
+
+ if ((rc = Cache_AppendKey (r, pParam, "stylesheet", pKey)) != ok)
+ return rc;
+
+ sv_catpv (pKey, "*xalan") ;
+ return ok ;
+ }
+
+/* ------------------------------------------------------------------------ */
+/* */
+/* ProviderXalan_iowrite */
+/* */
+/* output callback */
+/* */
+/* ------------------------------------------------------------------------ */
+
+static long unsigned int ProviderXalan_iowrite (const char *buffer,
+ long unsigned int len,
+ void *context)
+
+ {
+ sv_catpvn (((tProviderXalan *)context) -> pOutputSV, buffer, len) ;
+ return len ;
+ }
+
+
+/* ------------------------------------------------------------------------ */
+/* */
+/* ProviderXalan_GetContentPtr */
+/* */
+/*!
+* \_en
+* Get the whole content from the provider.
+* This gets the stylesheet and compiles it
+*
+* @param r Embperl request record
+* @param pProvider The provider record
+* @param pData Returns the content
+* @return error code
+* \endif
+*
+* \_de
+* Holt den gesamt Inhalt vom Provider.
+* Die Funktion holt sich das Stylesheet und kompiliert es
+*
+* @param r Embperl request record
+* @param pProvider The provider record
+* @param pData Liefert den Inhalt
+* @return Fehlercode
+* \endif
+*
+* ------------------------------------------------------------------------ */
+
+
+
+static int ProviderXalan_GetContentSV (/*in*/ req * r,
+ /*in*/ tProvider * pProvider,
+ /*in*/ SV * * pData)
+
+ {
+ int rc ;
+ char * p ;
+ STRLEN len ;
+ SV * pSource ;
+
+
+ tCacheItem * pSrcCache = Cache_GetDependency(r, pProvider -> pCache, 0) ;
+ tCacheItem * pXSLCache = Cache_GetDependency(r, pProvider -> pCache, 0) ;
+
+ if ((rc = Cache_GetContentSV (r, pSrcCache, &pSource)) != ok)
+ return rc ;
+
+ if ((rc = Cache_GetContentPtr (r, pXSLCache, (void * *)&pCompiledXSL)) != ok)
+ return rc ;
+
+ if (((tProviderXalan *)pProvider) -> pOutputSV)
+ SvREFCNT_dec (((tProviderXalan *)pProvider) -> pOutputSV) ;
+
+ ((tProviderXalan *)pProvider) -> pOutputSV = newSV(1024) ;
+
+ // Our input streams...
+ p = SvPV (pSource, len) ;
+ istrstream theXMLStream(p, len);
+
+ // Do the transform.
+
+ const XalanParsedSource * parsedXML = 0;
+ theXalanTransformer -> parseSource(&theXMLStream, parsedXML);
+
+ int theResult = theXalanTransformer -> transform(*parsedXML, pCompiledXSL, r,
iowrite, NULL);
+
+ if(theResult != 0)
+ {
+ strncpy (r -> errdat1, "XSLT", sizeof (r -> errdat1)) ;
+ strncpy (r -> errdat2, theXalanTransformer -> getLastError(), sizeof (r ->
errdat2) - 2) ;
+ return rcXalanError ;
+ }
+
+ *pData = ((tProviderXalan *)pProvider) -> pOutputSV ;
+
+
+ return ok ;
+ }
+
+/* ------------------------------------------------------------------------ */
+/* */
+/* ProviderXalan_FreeContent */
+/* */
+/*!
+* \_en
+* Free the cached data
+*
+* @param r Embperl request record
+* @param pProvider The provider record
+* @return error code
+* \endif
+*
+* \_de
+* Gibt die gecachten Daten frei
+*
+* @param r Embperl request record
+* @param pProvider The provider record
+* @return Fehlercode
+* \endif
+*
+* ------------------------------------------------------------------------ */
+
+
+
+static int ProviderXalan_FreeContent(/*in*/ req * r,
+ /*in*/ tCacheItem * pItem)
+
+ {
+ if (((tProviderXalan *)pProvider) -> pOutputSV)
+ SvREFCNT_dec (((tProviderXalan *)pItem -> pProvider) -> pOutputSV) ;
+
+ ((tProviderXalan *)pItem -> pProvider) -> pOutputSV = NULL ;
+
+ return ok ;
+ }
+
+/* ------------------------------------------------------------------------ */
+
+static tProviderClass ProviderClassXalanXSL =
+ {
+ "text/*",
+ &ProviderXalan_New,
+ &ProviderXalan_AppendKey,
+ NULL,
+ &ProviderXalan_GetContentSV,
+ NULL,
+ NULL,
+ &ProviderXalan_FreeContent,
+ NULL,
+ } ;
+
+
+
+/* ------------------------------------------------------------------------ */
+
+int embperl_Xalan_Init ()
+ {
+ Cache_AddProviderClass ("xalan-compile-xsl", &ProviderClassXalanXSL) ;
+ Cache_AddProviderClass ("xalan", &ProviderClassXalan) ;
+
+ // Call the static initializer for Xerces.
+ XMLPlatformUtils::Initialize();
+
+ // Initialize Xalan.
+ XalanTransformer::initialize();
+
+
+ theXalanTransformer = new XalanTransformer ;
+ }
+
+
+
+
} /* extern C */
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]