mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-29 04:17:55 +01:00
added PageCompiler
This commit is contained in:
17
PageCompiler/Makefile
Normal file
17
PageCompiler/Makefile
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#
|
||||||
|
# Makefile
|
||||||
|
#
|
||||||
|
# $Id: //poco/Main/PageCompiler/Makefile#1 $
|
||||||
|
#
|
||||||
|
# Makefile for Poco C++ Server Page Compiler
|
||||||
|
#
|
||||||
|
|
||||||
|
include $(POCO_BASE)/build/rules/global
|
||||||
|
|
||||||
|
objects = Page PageCompiler
|
||||||
|
|
||||||
|
target = cpspc
|
||||||
|
target_version = 1
|
||||||
|
target_libs = PocoNet PocoUtil PocoXML PocoFoundation
|
||||||
|
|
||||||
|
include $(POCO_BASE)/build/rules/exec
|
||||||
21
PageCompiler/PageCompiler_vs71.sln
Normal file
21
PageCompiler/PageCompiler_vs71.sln
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 8.00
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PageCompiler", "PageCompiler_vs71.vcproj", "{73408DCF-2E65-47AF-BF38-7466DAB8D5CB}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfiguration) = preSolution
|
||||||
|
debug_shared = debug_shared
|
||||||
|
release_shared = release_shared
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfiguration) = postSolution
|
||||||
|
{73408DCF-2E65-47AF-BF38-7466DAB8D5CB}.debug_shared.ActiveCfg = debug_shared|Win32
|
||||||
|
{73408DCF-2E65-47AF-BF38-7466DAB8D5CB}.debug_shared.Build.0 = debug_shared|Win32
|
||||||
|
{73408DCF-2E65-47AF-BF38-7466DAB8D5CB}.release_shared.ActiveCfg = release_shared|Win32
|
||||||
|
{73408DCF-2E65-47AF-BF38-7466DAB8D5CB}.release_shared.Build.0 = release_shared|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityAddIns) = postSolution
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
280
PageCompiler/PageCompiler_vs71.vcproj
Normal file
280
PageCompiler/PageCompiler_vs71.vcproj
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="7.10"
|
||||||
|
Name="PageCompiler"
|
||||||
|
ProjectGUID="{73408DCF-2E65-47AF-BF38-7466DAB8D5CB}"
|
||||||
|
Keyword="Win32Proj">
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"/>
|
||||||
|
</Platforms>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="debug_shared|Win32"
|
||||||
|
OutputDirectory="obj\debug_shared"
|
||||||
|
IntermediateDirectory="obj\debug_shared"
|
||||||
|
ConfigurationType="1"
|
||||||
|
UseOfMFC="2"
|
||||||
|
CharacterSet="2">
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories=".\include;..\Foundation\include;..\XML\include;..\Util\include;..\Net\include"
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;POCO_DLL;WINVER=0x0500"
|
||||||
|
MinimalRebuild="TRUE"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
BufferSecurityCheck="TRUE"
|
||||||
|
TreatWChar_tAsBuiltInType="TRUE"
|
||||||
|
ForceConformanceInForLoopScope="TRUE"
|
||||||
|
RuntimeTypeInfo="TRUE"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="TRUE"
|
||||||
|
DebugInformationFormat="4"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="PocoFoundationd.lib PocoXMLd.lib PocoUtild.lib PocoNetd.lib"
|
||||||
|
OutputFile="bin/cpspcd.exe"
|
||||||
|
LinkIncremental="2"
|
||||||
|
AdditionalLibraryDirectories="..\lib"
|
||||||
|
GenerateDebugInformation="TRUE"
|
||||||
|
ProgramDatabaseFile="bin/PageCompilerd.pdb"
|
||||||
|
SubSystem="1"
|
||||||
|
TargetMachine="1"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedWrapperGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="release_shared|Win32"
|
||||||
|
OutputDirectory="obj\release_shared"
|
||||||
|
IntermediateDirectory="obj\release_shared"
|
||||||
|
ConfigurationType="1"
|
||||||
|
UseOfMFC="2"
|
||||||
|
CharacterSet="2">
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="4"
|
||||||
|
InlineFunctionExpansion="1"
|
||||||
|
EnableIntrinsicFunctions="TRUE"
|
||||||
|
FavorSizeOrSpeed="1"
|
||||||
|
OmitFramePointers="TRUE"
|
||||||
|
OptimizeForWindowsApplication="TRUE"
|
||||||
|
AdditionalIncludeDirectories=".\include;..\Foundation\include;..\XML\include;..\Util\include;..\Net\include"
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;POCO_DLL;WINVER=0x0500"
|
||||||
|
StringPooling="TRUE"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
BufferSecurityCheck="FALSE"
|
||||||
|
TreatWChar_tAsBuiltInType="TRUE"
|
||||||
|
ForceConformanceInForLoopScope="TRUE"
|
||||||
|
RuntimeTypeInfo="TRUE"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="TRUE"
|
||||||
|
DebugInformationFormat="3"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="PocoFoundation.lib PocoXML.lib PocoUtil.lib PocoNet.lib"
|
||||||
|
OutputFile="bin/cpspc.exe"
|
||||||
|
LinkIncremental="1"
|
||||||
|
AdditionalLibraryDirectories="..\lib"
|
||||||
|
GenerateDebugInformation="FALSE"
|
||||||
|
ProgramDatabaseFile=""
|
||||||
|
SubSystem="1"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
TargetMachine="1"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedWrapperGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="debug_static|Win32"
|
||||||
|
OutputDirectory="obj\debug_static"
|
||||||
|
IntermediateDirectory="obj\debug_static"
|
||||||
|
ConfigurationType="1"
|
||||||
|
UseOfMFC="2"
|
||||||
|
CharacterSet="2">
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories=".\include;..\..\..\Foundation\include;..\..\..\XML\include;..\..\..\Util\include"
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;POCO_STATIC;WINVER=0x0500"
|
||||||
|
MinimalRebuild="TRUE"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
BufferSecurityCheck="TRUE"
|
||||||
|
TreatWChar_tAsBuiltInType="TRUE"
|
||||||
|
ForceConformanceInForLoopScope="TRUE"
|
||||||
|
RuntimeTypeInfo="TRUE"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="TRUE"
|
||||||
|
DebugInformationFormat="4"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="PocoFoundationmtd.lib PocoXMLmtd.lib PocoUtilmtd.lib advapi32.lib"
|
||||||
|
OutputFile="bin/PageCompilermtd.exe"
|
||||||
|
LinkIncremental="2"
|
||||||
|
AdditionalLibraryDirectories="..\..\..\lib"
|
||||||
|
GenerateDebugInformation="TRUE"
|
||||||
|
ProgramDatabaseFile="bin/PageCompilermtd.pdb"
|
||||||
|
SubSystem="1"
|
||||||
|
TargetMachine="1"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedWrapperGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="release_static|Win32"
|
||||||
|
OutputDirectory="obj\release_static"
|
||||||
|
IntermediateDirectory="obj\release_static"
|
||||||
|
ConfigurationType="1"
|
||||||
|
UseOfMFC="2"
|
||||||
|
CharacterSet="2">
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="4"
|
||||||
|
InlineFunctionExpansion="1"
|
||||||
|
EnableIntrinsicFunctions="TRUE"
|
||||||
|
FavorSizeOrSpeed="1"
|
||||||
|
OmitFramePointers="TRUE"
|
||||||
|
OptimizeForWindowsApplication="TRUE"
|
||||||
|
AdditionalIncludeDirectories=".\include;..\..\..\Foundation\include;..\..\..\XML\include;..\..\..\Util\include"
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;POCO_STATIC;WINVER=0x0500"
|
||||||
|
StringPooling="TRUE"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
BufferSecurityCheck="FALSE"
|
||||||
|
TreatWChar_tAsBuiltInType="TRUE"
|
||||||
|
ForceConformanceInForLoopScope="TRUE"
|
||||||
|
RuntimeTypeInfo="TRUE"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="TRUE"
|
||||||
|
DebugInformationFormat="3"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="PocoFoundationmt.lib PocoXMLmt.lib PocoUtilmt.lib advapi32.lib"
|
||||||
|
OutputFile="bin/PageCompilermt.exe"
|
||||||
|
LinkIncremental="1"
|
||||||
|
AdditionalLibraryDirectories="..\..\..\lib"
|
||||||
|
GenerateDebugInformation="FALSE"
|
||||||
|
ProgramDatabaseFile=""
|
||||||
|
SubSystem="1"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
TargetMachine="1"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedWrapperGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Configuration Files"
|
||||||
|
Filter="">
|
||||||
|
<File
|
||||||
|
RelativePath=".\cpspc.properties">
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="">
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\Page.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\PageCompiler.cpp">
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="">
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\Page.h">
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
||||||
20
PageCompiler/PageCompiler_vs80.sln
Normal file
20
PageCompiler/PageCompiler_vs80.sln
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||||
|
# Visual Studio 2005
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PageCompiler", "PageCompiler_vs80.vcproj", "{E12E5C71-79A4-495A-848F-F1710111E610}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
debug_shared|Win32 = debug_shared|Win32
|
||||||
|
release_shared|Win32 = release_shared|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{E12E5C71-79A4-495A-848F-F1710111E610}.debug_shared|Win32.ActiveCfg = debug_shared|Win32
|
||||||
|
{E12E5C71-79A4-495A-848F-F1710111E610}.debug_shared|Win32.Build.0 = debug_shared|Win32
|
||||||
|
{E12E5C71-79A4-495A-848F-F1710111E610}.release_shared|Win32.ActiveCfg = release_shared|Win32
|
||||||
|
{E12E5C71-79A4-495A-848F-F1710111E610}.release_shared|Win32.Build.0 = release_shared|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
229
PageCompiler/PageCompiler_vs80.vcproj
Normal file
229
PageCompiler/PageCompiler_vs80.vcproj
Normal file
@@ -0,0 +1,229 @@
|
|||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8.00"
|
||||||
|
Name="PageCompiler"
|
||||||
|
ProjectGUID="{E12E5C71-79A4-495A-848F-F1710111E610}"
|
||||||
|
Keyword="Win32Proj"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="debug_shared|Win32"
|
||||||
|
OutputDirectory="obj\debug_shared"
|
||||||
|
IntermediateDirectory="obj\debug_shared"
|
||||||
|
ConfigurationType="1"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="2"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories=".\include;..\Foundation\include;..\XML\include;..\Util\include;..\Net\include"
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;POCO_DLL;WINVER=0x0500"
|
||||||
|
MinimalRebuild="true"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
BufferSecurityCheck="true"
|
||||||
|
TreatWChar_tAsBuiltInType="true"
|
||||||
|
ForceConformanceInForLoopScope="true"
|
||||||
|
RuntimeTypeInfo="true"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="PocoFoundationd.lib PocoXMLd.lib PocoUtild.lib PocoNetd.lib"
|
||||||
|
OutputFile="bin/cpspcd.exe"
|
||||||
|
LinkIncremental="2"
|
||||||
|
AdditionalLibraryDirectories="..\lib"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
ProgramDatabaseFile="bin/cpspcd.pdb"
|
||||||
|
SubSystem="1"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="release_shared|Win32"
|
||||||
|
OutputDirectory="obj\release_shared"
|
||||||
|
IntermediateDirectory="obj\release_shared"
|
||||||
|
ConfigurationType="1"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="2"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="4"
|
||||||
|
InlineFunctionExpansion="1"
|
||||||
|
EnableIntrinsicFunctions="true"
|
||||||
|
FavorSizeOrSpeed="1"
|
||||||
|
OmitFramePointers="true"
|
||||||
|
AdditionalIncludeDirectories=".\include;..\Foundation\include;..\XML\include;..\Util\include;..\Net\include"
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;POCO_DLL;WINVER=0x0500"
|
||||||
|
StringPooling="true"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
BufferSecurityCheck="false"
|
||||||
|
TreatWChar_tAsBuiltInType="true"
|
||||||
|
ForceConformanceInForLoopScope="true"
|
||||||
|
RuntimeTypeInfo="true"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="PocoFoundation.lib PocoXML.lib PocoUtil.lib PocoNet.lib"
|
||||||
|
OutputFile="bin/cpspc.exe"
|
||||||
|
LinkIncremental="1"
|
||||||
|
AdditionalLibraryDirectories="..\lib"
|
||||||
|
GenerateDebugInformation="false"
|
||||||
|
ProgramDatabaseFile=""
|
||||||
|
SubSystem="1"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Configuration Files"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\cpspc.properties"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\Page.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\PageCompiler.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\Page.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
||||||
1
PageCompiler/cpspc.properties
Normal file
1
PageCompiler/cpspc.properties
Normal file
@@ -0,0 +1 @@
|
|||||||
|
PageCompiler.fileHeader = //\n// ${outputFileName}\n//\n// This file has been generated from ${inputFileName} on ${dateTime}.\n//
|
||||||
270
PageCompiler/doc/PageCompilerUserGuide.page
Normal file
270
PageCompiler/doc/PageCompilerUserGuide.page
Normal file
@@ -0,0 +1,270 @@
|
|||||||
|
POCO C++ Server Page Compiler User Guide
|
||||||
|
PageCompiler
|
||||||
|
|
||||||
|
!!!Introduction
|
||||||
|
PageCompiler is a command line tool that translates HTML files (and other kinds of files), into
|
||||||
|
C++ code, more precisely, subclasses of Poco::Net::HTTPRequestHandler.
|
||||||
|
The source files can contain special directives that allow it to include C++ code into
|
||||||
|
the source file. The syntax of this directives is based on the syntax used for
|
||||||
|
Java Server Pages (JSP) and PHP.
|
||||||
|
|
||||||
|
The following introductory sample shows the code for a simple page that displays the
|
||||||
|
current date and time.
|
||||||
|
|
||||||
|
<%@ page class="TimeHandler" %>
|
||||||
|
<%!
|
||||||
|
#include "Poco/DateTime.h"
|
||||||
|
#include "Poco/DateTimeFormatter.h"
|
||||||
|
#include "Poco/DateTimeFormat.h"
|
||||||
|
|
||||||
|
|
||||||
|
using Poco::DateTime;
|
||||||
|
using Poco::DateTimeFormatter;
|
||||||
|
using Poco::DateTimeFormat;
|
||||||
|
%>
|
||||||
|
|
||||||
|
<%
|
||||||
|
DateTime now;
|
||||||
|
std::string dt(DateTimeFormatter::format(now, DateTimeFormat::SORTABLE_FORMAT));
|
||||||
|
%>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Time Sample</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Time Sample</h1>
|
||||||
|
<p><%= dt %></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
----
|
||||||
|
|
||||||
|
Sending the above code to the page compiler will generate two files, a header file
|
||||||
|
(<[TimeHandler.h]>) and an implementation file (<[TimeHandler.cpp]>).
|
||||||
|
The files define a subclass of Poco::Net::HTTPRequestHandler named <[TimeHandler]>.
|
||||||
|
The generated <[handleRequest]> member function contains code to send the HTML
|
||||||
|
code contained in the source file to the client, as well as the C++ code fragments found
|
||||||
|
in between the Scriptlet tags.
|
||||||
|
|
||||||
|
|
||||||
|
!!!C++ Server Page Syntax
|
||||||
|
|
||||||
|
The following special tags are supported in a C++ server page (CPSP) file.
|
||||||
|
|
||||||
|
!!Hidden Comment
|
||||||
|
|
||||||
|
A hidden comment documents the CPSP file, but is not sent to the client.
|
||||||
|
|
||||||
|
<%-- <comment> --%>
|
||||||
|
----
|
||||||
|
|
||||||
|
!!Implementation Declaration
|
||||||
|
|
||||||
|
An implementation declaration is copied to the implementation file immediately after
|
||||||
|
the block containing the standard <[#include]> directives.
|
||||||
|
It is used to include additional header files and <[using]> declarations,
|
||||||
|
as well as to define classes needed later on.
|
||||||
|
|
||||||
|
<%!
|
||||||
|
<declaration>
|
||||||
|
...
|
||||||
|
%>
|
||||||
|
----
|
||||||
|
|
||||||
|
!!Header Declaration
|
||||||
|
|
||||||
|
A header declaration is copied to the header file immediately after the
|
||||||
|
block containing the standard <[#include]> directives.
|
||||||
|
It is usually used to include the header file containing the definition
|
||||||
|
of the base class for the request handler, if a custom base class
|
||||||
|
is required.
|
||||||
|
|
||||||
|
<%!!
|
||||||
|
<declaration>
|
||||||
|
...
|
||||||
|
%>
|
||||||
|
----
|
||||||
|
|
||||||
|
!!Expression
|
||||||
|
|
||||||
|
The result of any valid C++ expression can be directly inserted into the page,
|
||||||
|
provided the result can be written to an output stream. Note that the expression
|
||||||
|
must not end with a semicolon.
|
||||||
|
|
||||||
|
<%= <expression> %>
|
||||||
|
----
|
||||||
|
|
||||||
|
!!Scriptlet
|
||||||
|
|
||||||
|
Arbitrary C++ code fragments can be included using the Scriptlet directive.
|
||||||
|
|
||||||
|
<%
|
||||||
|
<statement>
|
||||||
|
...
|
||||||
|
%>
|
||||||
|
----
|
||||||
|
|
||||||
|
!!Include Directive
|
||||||
|
|
||||||
|
Another CPSP file can be included into the current file using the Include
|
||||||
|
Directive.
|
||||||
|
|
||||||
|
<%@ include page="<path>" %>
|
||||||
|
----
|
||||||
|
|
||||||
|
If the given path is relative, it is considered relative to the path of
|
||||||
|
the currently processed CPSP file.
|
||||||
|
|
||||||
|
!!Page Directive
|
||||||
|
|
||||||
|
The Page Directive allows the definition of attributes that control
|
||||||
|
various aspects of C++ code generation.
|
||||||
|
|
||||||
|
<%@ page <attr>="<value>" ... %>
|
||||||
|
----
|
||||||
|
|
||||||
|
The following page attributes are supported:
|
||||||
|
|
||||||
|
!class
|
||||||
|
|
||||||
|
Specifies the name of the generated class.
|
||||||
|
Defaults to the base name of the source file with the word "Handler" appended.
|
||||||
|
|
||||||
|
!namespace
|
||||||
|
|
||||||
|
If specified, sets the namespace where the generated classes will be in.
|
||||||
|
No namespace will be used if omitted.
|
||||||
|
|
||||||
|
!baseClass
|
||||||
|
|
||||||
|
Specifies the name of the class used as the base class for the generated
|
||||||
|
request handler class.
|
||||||
|
Defaults to Poco::Net::HTTPRequestHandler. Do not forget to add a Header Declaration
|
||||||
|
containing an <[#include]> directive for the header file containing the definition
|
||||||
|
of that class, otherwise the generated code won't compile.
|
||||||
|
|
||||||
|
!ctorArg
|
||||||
|
|
||||||
|
Allows to specify the type of a single argument being passed to the constructor
|
||||||
|
of the generated request handler class. Can only be used together with <[baseClass]>.
|
||||||
|
The argument is passed on to the constructor of the base class, therefore, one of the
|
||||||
|
constructors of the base class must also accept a single argument of the specified type.
|
||||||
|
|
||||||
|
!export
|
||||||
|
|
||||||
|
Allows to specify a DLL import/export directive that is being added to the request
|
||||||
|
handler class definition. Useful for exporting a request handler class from a
|
||||||
|
Windows DLL.
|
||||||
|
|
||||||
|
!form
|
||||||
|
|
||||||
|
Enable or disable automatic form handling. If enabled, which is the default,
|
||||||
|
a Poco::Net::HTMLForm object is automatically created in the request handler
|
||||||
|
and accessible through a variable named <[form]>.
|
||||||
|
Set the value to <[false]> to disable form handling.
|
||||||
|
|
||||||
|
!formPartHandler
|
||||||
|
|
||||||
|
Allows you to pass a Poco::Net::PartHandler object to the form object for
|
||||||
|
processing file uploads. A subclass of Poco::Net::PartHandler must be
|
||||||
|
defined (using an Implementation Declaration), and the constructor of the part
|
||||||
|
handler must take a (const) reference to the request handler instance as argument.
|
||||||
|
|
||||||
|
!contentType
|
||||||
|
|
||||||
|
Allows you to specify the MIME content type for the page. Defaults to text/html.
|
||||||
|
|
||||||
|
!chunked
|
||||||
|
|
||||||
|
Allows you to specify whether the response is sent using chunked transfer encoding.
|
||||||
|
Defaults to <[true]>.
|
||||||
|
Set the value to <[false]> to disable chunked transfer encoding.
|
||||||
|
|
||||||
|
!session (OSP only)
|
||||||
|
|
||||||
|
For use with the POCO Open Service Platform only.
|
||||||
|
|
||||||
|
Specifies the identifier of the session obtained from the OSP Web Session Manager.
|
||||||
|
If specified, a Poco::OSP::Web::WebSession object will be available in the
|
||||||
|
request handler through a variable named <[session]>. The variable is of type
|
||||||
|
Poco::OSP::Web::WebSession::Ptr.
|
||||||
|
|
||||||
|
!sessionTimeout (OSP only)
|
||||||
|
|
||||||
|
For use with the POCO Open Service Platform only.
|
||||||
|
|
||||||
|
Specifies the session timeout in minutes.
|
||||||
|
|
||||||
|
|
||||||
|
!!Implicit Objects
|
||||||
|
|
||||||
|
The following objects are available in the handler code.
|
||||||
|
|
||||||
|
!request
|
||||||
|
|
||||||
|
The HTTP request object - an instance of Poco::Net::HTTPServerRequest.
|
||||||
|
|
||||||
|
!response
|
||||||
|
|
||||||
|
The HTTP response object - an instance of Poco::Net::HTTPServerRequest.
|
||||||
|
|
||||||
|
!form
|
||||||
|
|
||||||
|
An instance of Poco::Net::HTMLForm for processing form arguments.
|
||||||
|
Only available if form processing has not been disabled by
|
||||||
|
setting the <[form]> page attribute to <[false]>.
|
||||||
|
|
||||||
|
!session (OSP only)
|
||||||
|
|
||||||
|
An instance of Poco::OSP::Web::WebSession::Ptr for accessing the
|
||||||
|
Poco::OSP::Web::WebSession object for the current session.
|
||||||
|
Only available with the POCO Open Service Platform, and if the
|
||||||
|
<[session]> page attribute has been specified.
|
||||||
|
|
||||||
|
|
||||||
|
!!!Invoking the Page Compiler
|
||||||
|
|
||||||
|
The Page Compiler is invoked from the command line. The file names of the
|
||||||
|
CPSP files to be compiled are specified as arguments.
|
||||||
|
|
||||||
|
A number of options control the code generation. Options are specified
|
||||||
|
using the usual command-line option syntax for the current operating
|
||||||
|
system (e.g., <[/help]> on Windows, <[--help]> or <[-h]> on Unix).
|
||||||
|
|
||||||
|
* help (h): display usage information
|
||||||
|
* define (D): define a configuration property
|
||||||
|
* config-file (f): load configuration properties from a file
|
||||||
|
* osp (O): add factory class definition/implementation for use with OSP
|
||||||
|
* apache (A): add factory class definition/implementation and shared library manifest for use with ApacheConnector
|
||||||
|
|
||||||
|
!!Configuration Properties
|
||||||
|
|
||||||
|
The Page Compiler supports one configuration property, named
|
||||||
|
<[PageCompiler.fileHeader]>, to optionally specify a header that is
|
||||||
|
included in every generated file.
|
||||||
|
|
||||||
|
The file header can contain references to other configuration properties,
|
||||||
|
using the usual property syntax: <[${property}]>.
|
||||||
|
|
||||||
|
For example, invoking the Page Compiler with the following configuration
|
||||||
|
file:
|
||||||
|
|
||||||
|
PageCompiler.fileHeader = //\n// ${outputFileName}\n//\n
|
||||||
|
----
|
||||||
|
|
||||||
|
places the following header at the beginning of each generated file
|
||||||
|
(<[<filename>]> is replaced with the actual name of the file):
|
||||||
|
|
||||||
|
//
|
||||||
|
// <filename>
|
||||||
|
//
|
||||||
|
----
|
||||||
|
|
||||||
|
The following pre-defined properties can be used in the file header:
|
||||||
|
|
||||||
|
* <[${inputFileName}]>: the name of the input file (with directories removed)
|
||||||
|
* <[${inputFilePath}]>: the complete path of the input file
|
||||||
|
* <[${dateTime}]>: the current date and time (YYYY-MM-DD HH:MM:SS)
|
||||||
|
* <[${outputFileName}]>: the name of the current output file (header or implementation file), with
|
||||||
|
directories removed
|
||||||
|
* <[${outputFilePath}]>: the complete path of the current output file
|
||||||
|
|
||||||
357
PageCompiler/src/Page.cpp
Normal file
357
PageCompiler/src/Page.cpp
Normal file
@@ -0,0 +1,357 @@
|
|||||||
|
//
|
||||||
|
// Page.cpp
|
||||||
|
//
|
||||||
|
// $Id: //poco/Main/PageCompiler/src/Page.cpp#1 $
|
||||||
|
//
|
||||||
|
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||||
|
// and Contributors.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
// obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
// this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
// execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
// Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
// do so, all subject to the following:
|
||||||
|
//
|
||||||
|
// The copyright notices in the Software and this entire statement, including
|
||||||
|
// the above license grant, this restriction and the following disclaimer,
|
||||||
|
// must be included in all copies of the Software, in whole or in part, and
|
||||||
|
// all derivative works of the Software, unless such copies or derivative
|
||||||
|
// works are solely in the form of machine-executable object code generated by
|
||||||
|
// a source language processor.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
// DEALINGS IN THE SOFTWARE.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#include "Page.h"
|
||||||
|
#include "Poco/FileStream.h"
|
||||||
|
#include "Poco/CountingStream.h"
|
||||||
|
#include "Poco/Path.h"
|
||||||
|
#include "Poco/Exception.h"
|
||||||
|
#include <sstream>
|
||||||
|
#include <cctype>
|
||||||
|
|
||||||
|
|
||||||
|
const std::string Page::MARKUP_BEGIN("\tostr << \"");
|
||||||
|
const std::string Page::MARKUP_END("\";\n");
|
||||||
|
const std::string Page::EXPR_BEGIN("\tostr << ");
|
||||||
|
const std::string Page::EXPR_END(";\n");
|
||||||
|
|
||||||
|
|
||||||
|
Page::Page(const std::string& basePath)
|
||||||
|
{
|
||||||
|
_headerDecls.reserve(4096);
|
||||||
|
_implDecls.reserve(8192);
|
||||||
|
_paths.push_back(basePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Page::~Page()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Page::addHeaderDecls(const std::string& decls)
|
||||||
|
{
|
||||||
|
_headerDecls.append("\n");
|
||||||
|
_headerDecls.append(decls);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Page::addImplDecls(const std::string& decls)
|
||||||
|
{
|
||||||
|
_implDecls.append("\n");
|
||||||
|
_implDecls.append(decls);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Page::addAttrs(const std::string& attrs)
|
||||||
|
{
|
||||||
|
_attrs.append(attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Page::parse(std::istream& pageStream)
|
||||||
|
{
|
||||||
|
std::ostringstream handlerStream;
|
||||||
|
parse(pageStream, handlerStream);
|
||||||
|
_handler = handlerStream.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Page::parse(std::istream& pageStream, std::ostream& handlerStream)
|
||||||
|
{
|
||||||
|
ParsingState state = STATE_MARKUP;
|
||||||
|
|
||||||
|
_attrs.clear();
|
||||||
|
handlerStream << MARKUP_BEGIN;
|
||||||
|
|
||||||
|
Poco::CountingInputStream countingPageStream(pageStream);
|
||||||
|
std::string token;
|
||||||
|
nextToken(pageStream, token);
|
||||||
|
while (!token.empty())
|
||||||
|
{
|
||||||
|
if (token == "<%")
|
||||||
|
{
|
||||||
|
if (state == STATE_MARKUP)
|
||||||
|
{
|
||||||
|
handlerStream << MARKUP_END;
|
||||||
|
state = STATE_BLOCK;
|
||||||
|
}
|
||||||
|
else handlerStream << token;
|
||||||
|
}
|
||||||
|
else if (token == "<%!")
|
||||||
|
{
|
||||||
|
if (state == STATE_MARKUP)
|
||||||
|
{
|
||||||
|
handlerStream << MARKUP_END;
|
||||||
|
state = STATE_IMPLDECL;
|
||||||
|
}
|
||||||
|
else handlerStream << token;
|
||||||
|
}
|
||||||
|
else if (token == "<%!!")
|
||||||
|
{
|
||||||
|
if (state == STATE_MARKUP)
|
||||||
|
{
|
||||||
|
handlerStream << MARKUP_END;
|
||||||
|
state = STATE_HDRDECL;
|
||||||
|
}
|
||||||
|
else handlerStream << token;
|
||||||
|
}
|
||||||
|
else if (token == "<%--")
|
||||||
|
{
|
||||||
|
if (state == STATE_MARKUP)
|
||||||
|
{
|
||||||
|
handlerStream << MARKUP_END;
|
||||||
|
state = STATE_COMMENT;
|
||||||
|
}
|
||||||
|
else handlerStream << token;
|
||||||
|
}
|
||||||
|
else if (token == "<%@")
|
||||||
|
{
|
||||||
|
if (state == STATE_MARKUP)
|
||||||
|
{
|
||||||
|
handlerStream << MARKUP_END;
|
||||||
|
state = STATE_ATTR;
|
||||||
|
}
|
||||||
|
else handlerStream << token;
|
||||||
|
}
|
||||||
|
else if (token == "<%=")
|
||||||
|
{
|
||||||
|
if (state == STATE_MARKUP)
|
||||||
|
{
|
||||||
|
handlerStream << MARKUP_END;
|
||||||
|
handlerStream << EXPR_BEGIN;
|
||||||
|
state = STATE_EXPR;
|
||||||
|
}
|
||||||
|
else handlerStream << token;
|
||||||
|
}
|
||||||
|
else if (token == "%>")
|
||||||
|
{
|
||||||
|
if (state == STATE_EXPR)
|
||||||
|
{
|
||||||
|
handlerStream << EXPR_END;
|
||||||
|
handlerStream << MARKUP_BEGIN;
|
||||||
|
state = STATE_MARKUP;
|
||||||
|
}
|
||||||
|
else if (state == STATE_ATTR)
|
||||||
|
{
|
||||||
|
parseAttributes(handlerStream);
|
||||||
|
_attrs.clear();
|
||||||
|
handlerStream << MARKUP_BEGIN;
|
||||||
|
state = STATE_MARKUP;
|
||||||
|
}
|
||||||
|
else if (state != STATE_MARKUP)
|
||||||
|
{
|
||||||
|
handlerStream << MARKUP_BEGIN;
|
||||||
|
state = STATE_MARKUP;
|
||||||
|
}
|
||||||
|
else handlerStream << token;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (state)
|
||||||
|
{
|
||||||
|
case STATE_MARKUP:
|
||||||
|
if (token == "\n")
|
||||||
|
{
|
||||||
|
handlerStream << "\\n";
|
||||||
|
handlerStream << MARKUP_END;
|
||||||
|
handlerStream << MARKUP_BEGIN;
|
||||||
|
}
|
||||||
|
else if (token == "\t")
|
||||||
|
{
|
||||||
|
handlerStream << "\\t";
|
||||||
|
}
|
||||||
|
else if (token == "\"")
|
||||||
|
{
|
||||||
|
handlerStream << "\\\"";
|
||||||
|
}
|
||||||
|
else if (token != "\r")
|
||||||
|
{
|
||||||
|
handlerStream << token;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STATE_IMPLDECL:
|
||||||
|
_implDecls += token;
|
||||||
|
break;
|
||||||
|
case STATE_HDRDECL:
|
||||||
|
_headerDecls += token;
|
||||||
|
break;
|
||||||
|
case STATE_BLOCK:
|
||||||
|
handlerStream << token;
|
||||||
|
break;
|
||||||
|
case STATE_EXPR:
|
||||||
|
handlerStream << token;
|
||||||
|
break;
|
||||||
|
case STATE_COMMENT:
|
||||||
|
break;
|
||||||
|
case STATE_ATTR:
|
||||||
|
_attrs += token;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nextToken(pageStream, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state == STATE_MARKUP)
|
||||||
|
{
|
||||||
|
handlerStream << MARKUP_END;
|
||||||
|
}
|
||||||
|
else throw Poco::SyntaxException("unclosed meta or code block", where());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Page::parseAttributes(std::ostream& handlerStream)
|
||||||
|
{
|
||||||
|
static const int eof = std::char_traits<char>::eof();
|
||||||
|
|
||||||
|
std::string basename;
|
||||||
|
std::istringstream istr(_attrs);
|
||||||
|
int ch = istr.get();
|
||||||
|
while (ch != eof && std::isspace(ch)) ch = istr.get();
|
||||||
|
while (ch != eof && std::isalnum(ch)) { basename += (char) ch; ch = istr.get(); }
|
||||||
|
while (ch != eof && std::isspace(ch)) ch = istr.get();
|
||||||
|
while (ch != eof)
|
||||||
|
{
|
||||||
|
std::string name(basename + ".");
|
||||||
|
std::string value;
|
||||||
|
while (ch != eof && std::isalnum(ch)) { name += (char) ch; ch = istr.get(); }
|
||||||
|
while (ch != eof && std::isspace(ch)) ch = istr.get();
|
||||||
|
if (ch != '=') throw Poco::SyntaxException("bad attribute syntax: '=' expected", where());
|
||||||
|
ch = istr.get();
|
||||||
|
while (ch != eof && std::isspace(ch)) ch = istr.get();
|
||||||
|
if (ch != '"') throw Poco::SyntaxException("bad attribute syntax: '\"' expected", where());
|
||||||
|
ch = istr.get();
|
||||||
|
while (ch != eof && ch != '"') { value += (char) ch; ch = istr.get(); }
|
||||||
|
if (ch != '"') throw Poco::SyntaxException("bad attribute syntax: '\"' expected", where());
|
||||||
|
ch = istr.get();
|
||||||
|
handleAttribute(name, value, handlerStream);
|
||||||
|
while (ch != eof && std::isspace(ch)) ch = istr.get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Page::nextToken(std::istream& istr, std::string& token)
|
||||||
|
{
|
||||||
|
token.clear();
|
||||||
|
int ch = istr.get();
|
||||||
|
if (ch != -1)
|
||||||
|
{
|
||||||
|
if (ch == '<' && istr.peek() == '%')
|
||||||
|
{
|
||||||
|
token += "<%";
|
||||||
|
ch = istr.get();
|
||||||
|
ch = istr.peek();
|
||||||
|
switch (ch)
|
||||||
|
{
|
||||||
|
case '!':
|
||||||
|
ch = istr.get();
|
||||||
|
token += (char) ch;
|
||||||
|
if (istr.peek() == '!')
|
||||||
|
{
|
||||||
|
ch = istr.get();
|
||||||
|
token += (char) ch;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '=':
|
||||||
|
ch = istr.get();
|
||||||
|
token += (char) ch;
|
||||||
|
break;
|
||||||
|
case '@':
|
||||||
|
ch = istr.get();
|
||||||
|
token += (char) ch;
|
||||||
|
break;
|
||||||
|
case '-':
|
||||||
|
ch = istr.get();
|
||||||
|
token += (char) ch;
|
||||||
|
if (istr.peek() == '-')
|
||||||
|
{
|
||||||
|
ch = istr.get();
|
||||||
|
token += (char) ch;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ch == '%' && istr.peek() == '>')
|
||||||
|
{
|
||||||
|
token += "%>";
|
||||||
|
ch = istr.get();
|
||||||
|
}
|
||||||
|
else token += (char) ch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Page::handleAttribute(const std::string& name, const std::string& value, std::ostream& handlerStream)
|
||||||
|
{
|
||||||
|
if (name == "include.page")
|
||||||
|
{
|
||||||
|
include(value, handlerStream);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
set(name, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Page::include(const std::string& path, std::ostream& handlerStream)
|
||||||
|
{
|
||||||
|
Poco::Path currentPath(_paths.back());
|
||||||
|
Poco::Path includePath(path);
|
||||||
|
currentPath.resolve(includePath);
|
||||||
|
handlerStream << "\t// begin include " << currentPath.toString() << "\n";
|
||||||
|
_paths.push_back(currentPath.toString());
|
||||||
|
if (_paths.size() > 100) throw Poco::ApplicationException("Too many includes", where());
|
||||||
|
Poco::FileInputStream includeStream(currentPath.toString());
|
||||||
|
parse(includeStream, handlerStream);
|
||||||
|
_paths.pop_back();
|
||||||
|
handlerStream << "\t// end include " << currentPath.toString() << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string Page::where()
|
||||||
|
{
|
||||||
|
std::string result("in file '");
|
||||||
|
std::vector<std::string>::reverse_iterator it = _paths.rbegin();
|
||||||
|
result += *it;
|
||||||
|
result += "'";
|
||||||
|
++it;
|
||||||
|
while (it != _paths.rend())
|
||||||
|
{
|
||||||
|
result += "\n\tincluded from file ";
|
||||||
|
result += "'";
|
||||||
|
result += *it;
|
||||||
|
result += "'";
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
123
PageCompiler/src/Page.h
Normal file
123
PageCompiler/src/Page.h
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
//
|
||||||
|
// Page.h
|
||||||
|
//
|
||||||
|
// $Id: //poco/Main/PageCompiler/src/Page.h#1 $
|
||||||
|
//
|
||||||
|
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||||
|
// and Contributors.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
// obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
// this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
// execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
// Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
// do so, all subject to the following:
|
||||||
|
//
|
||||||
|
// The copyright notices in the Software and this entire statement, including
|
||||||
|
// the above license grant, this restriction and the following disclaimer,
|
||||||
|
// must be included in all copies of the Software, in whole or in part, and
|
||||||
|
// all derivative works of the Software, unless such copies or derivative
|
||||||
|
// works are solely in the form of machine-executable object code generated by
|
||||||
|
// a source language processor.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
// DEALINGS IN THE SOFTWARE.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef Page_INCLUDED
|
||||||
|
#define Page_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include "Poco/Net/NameValueCollection.h"
|
||||||
|
#include <vector>
|
||||||
|
#include <istream>
|
||||||
|
#include <ostream>
|
||||||
|
|
||||||
|
|
||||||
|
class Page: public Poco::Net::NameValueCollection
|
||||||
|
/// This class represents a server page consisting of
|
||||||
|
/// handler code and declarations, as well as page attributes.
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Page(const std::string& basePath);
|
||||||
|
/// Creates a Page.
|
||||||
|
|
||||||
|
~Page();
|
||||||
|
/// Destroys the Page.
|
||||||
|
|
||||||
|
const std::string& headerDecls() const;
|
||||||
|
/// Returns the user-specified declarations for the header file.
|
||||||
|
|
||||||
|
const std::string& implDecls() const;
|
||||||
|
/// Returns the user-specified declarations for the source file.
|
||||||
|
|
||||||
|
const std::string& handler() const;
|
||||||
|
/// Returns the request handler code.
|
||||||
|
|
||||||
|
void parse(std::istream& istr);
|
||||||
|
/// Parses a HTML file containing server page directives.
|
||||||
|
|
||||||
|
protected:
|
||||||
|
enum ParsingState
|
||||||
|
{
|
||||||
|
STATE_MARKUP,
|
||||||
|
STATE_IMPLDECL,
|
||||||
|
STATE_HDRDECL,
|
||||||
|
STATE_BLOCK,
|
||||||
|
STATE_EXPR,
|
||||||
|
STATE_COMMENT,
|
||||||
|
STATE_ATTR
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual void handleAttribute(const std::string& name, const std::string& value, std::ostream& handlerStream);
|
||||||
|
void include(const std::string& path, std::ostream& handlerStream);
|
||||||
|
void parse(std::istream& pageStream, std::ostream& handlerStream);
|
||||||
|
void addHeaderDecls(const std::string& decls);
|
||||||
|
void addImplDecls(const std::string& decls);
|
||||||
|
void addAttrs(const std::string& attrs);
|
||||||
|
void parseAttributes(std::ostream& handlerStream);
|
||||||
|
void nextToken(std::istream& istr, std::string& token);
|
||||||
|
std::string where();
|
||||||
|
|
||||||
|
static const std::string MARKUP_BEGIN;
|
||||||
|
static const std::string MARKUP_END;
|
||||||
|
static const std::string EXPR_BEGIN;
|
||||||
|
static const std::string EXPR_END;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string _headerDecls;
|
||||||
|
std::string _implDecls;
|
||||||
|
std::string _handler;
|
||||||
|
std::string _attrs;
|
||||||
|
std::vector<std::string> _paths;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// inlines
|
||||||
|
//
|
||||||
|
inline const std::string& Page::headerDecls() const
|
||||||
|
{
|
||||||
|
return _headerDecls;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const std::string& Page::implDecls() const
|
||||||
|
{
|
||||||
|
return _implDecls;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const std::string& Page::handler() const
|
||||||
|
{
|
||||||
|
return _handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // Page_INCLUDED
|
||||||
515
PageCompiler/src/PageCompiler.cpp
Normal file
515
PageCompiler/src/PageCompiler.cpp
Normal file
@@ -0,0 +1,515 @@
|
|||||||
|
//
|
||||||
|
// PageCompiler.cpp
|
||||||
|
//
|
||||||
|
// $Id: //poco/Main/PageCompiler/src/PageCompiler.cpp#1 $
|
||||||
|
//
|
||||||
|
// A compiler that compiler HTML pages containing JSP directives into C++ classes.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||||
|
// and Contributors.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
// obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
// this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
// execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
// Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
// do so, all subject to the following:
|
||||||
|
//
|
||||||
|
// The copyright notices in the Software and this entire statement, including
|
||||||
|
// the above license grant, this restriction and the following disclaimer,
|
||||||
|
// must be included in all copies of the Software, in whole or in part, and
|
||||||
|
// all derivative works of the Software, unless such copies or derivative
|
||||||
|
// works are solely in the form of machine-executable object code generated by
|
||||||
|
// a source language processor.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
// DEALINGS IN THE SOFTWARE.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#include "Poco/Util/Application.h"
|
||||||
|
#include "Poco/Util/Option.h"
|
||||||
|
#include "Poco/Util/OptionSet.h"
|
||||||
|
#include "Poco/Util/HelpFormatter.h"
|
||||||
|
#include "Poco/Util/AbstractConfiguration.h"
|
||||||
|
#include "Poco/AutoPtr.h"
|
||||||
|
#include "Poco/FileStream.h"
|
||||||
|
#include "Poco/Path.h"
|
||||||
|
#include "Poco/DateTime.h"
|
||||||
|
#include "Poco/DateTimeFormatter.h"
|
||||||
|
#include "Poco/DateTimeFormat.h"
|
||||||
|
#include "Poco/StringTokenizer.h"
|
||||||
|
#include "Poco/LineEndingConverter.h"
|
||||||
|
#include "Page.h"
|
||||||
|
#include <cctype>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
|
using Poco::Util::Application;
|
||||||
|
using Poco::Util::Option;
|
||||||
|
using Poco::Util::OptionSet;
|
||||||
|
using Poco::Util::HelpFormatter;
|
||||||
|
using Poco::Util::AbstractConfiguration;
|
||||||
|
using Poco::Util::OptionCallback;
|
||||||
|
using Poco::AutoPtr;
|
||||||
|
using Poco::FileInputStream;
|
||||||
|
using Poco::FileOutputStream;
|
||||||
|
using Poco::Path;
|
||||||
|
using Poco::DateTime;
|
||||||
|
using Poco::DateTimeFormatter;
|
||||||
|
using Poco::DateTimeFormat;
|
||||||
|
using Poco::StringTokenizer;
|
||||||
|
using Poco::OutputLineEndingConverter;
|
||||||
|
|
||||||
|
|
||||||
|
class CompilerApp: public Application
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CompilerApp():
|
||||||
|
_helpRequested(false),
|
||||||
|
_generateOSPCode(false),
|
||||||
|
_generateApacheCode(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void initialize(Application& self)
|
||||||
|
{
|
||||||
|
loadConfiguration(); // load default configuration files, if present
|
||||||
|
Application::initialize(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
void defineOptions(OptionSet& options)
|
||||||
|
{
|
||||||
|
Application::defineOptions(options);
|
||||||
|
|
||||||
|
options.addOption(
|
||||||
|
Option("help", "h", "display help information on command line arguments")
|
||||||
|
.required(false)
|
||||||
|
.repeatable(false)
|
||||||
|
.callback(OptionCallback<CompilerApp>(this, &CompilerApp::handleHelp)));
|
||||||
|
|
||||||
|
options.addOption(
|
||||||
|
Option("define", "D", "define a property")
|
||||||
|
.required(false)
|
||||||
|
.repeatable(true)
|
||||||
|
.argument("name=value")
|
||||||
|
.callback(OptionCallback<CompilerApp>(this, &CompilerApp::handleDefine)));
|
||||||
|
|
||||||
|
options.addOption(
|
||||||
|
Option("config-file", "f", "load configuration data from a file")
|
||||||
|
.required(false)
|
||||||
|
.repeatable(true)
|
||||||
|
.argument("file")
|
||||||
|
.callback(OptionCallback<CompilerApp>(this, &CompilerApp::handleConfig)));
|
||||||
|
|
||||||
|
options.addOption(
|
||||||
|
Option("osp", "O", "add factory class definition/implementation for use with OSP")
|
||||||
|
.required(false)
|
||||||
|
.repeatable(false)
|
||||||
|
.callback(OptionCallback<CompilerApp>(this, &CompilerApp::handleOSP)));
|
||||||
|
|
||||||
|
options.addOption(
|
||||||
|
Option("apache", "A", "add factory class definition/implementation and shared library manifest for use with ApacheConnector")
|
||||||
|
.required(false)
|
||||||
|
.repeatable(false)
|
||||||
|
.callback(OptionCallback<CompilerApp>(this, &CompilerApp::handleApache)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleHelp(const std::string& name, const std::string& value)
|
||||||
|
{
|
||||||
|
_helpRequested = true;
|
||||||
|
displayHelp();
|
||||||
|
stopOptionsProcessing();
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleDefine(const std::string& name, const std::string& value)
|
||||||
|
{
|
||||||
|
defineProperty(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleConfig(const std::string& name, const std::string& value)
|
||||||
|
{
|
||||||
|
loadConfiguration(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleOSP(const std::string& name, const std::string& value)
|
||||||
|
{
|
||||||
|
_generateOSPCode = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleApache(const std::string& name, const std::string& value)
|
||||||
|
{
|
||||||
|
_generateApacheCode = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayHelp()
|
||||||
|
{
|
||||||
|
HelpFormatter helpFormatter(options());
|
||||||
|
helpFormatter.setCommand(commandName());
|
||||||
|
helpFormatter.setUsage("OPTIONS PAGES");
|
||||||
|
helpFormatter.setHeader("The POCO C++ Server Page Compiler.");
|
||||||
|
helpFormatter.format(std::cout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void defineProperty(const std::string& def)
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
std::string value;
|
||||||
|
std::string::size_type pos = def.find('=');
|
||||||
|
if (pos != std::string::npos)
|
||||||
|
{
|
||||||
|
name.assign(def, 0, pos);
|
||||||
|
value.assign(def, pos + 1, def.length() - pos);
|
||||||
|
}
|
||||||
|
else name = def;
|
||||||
|
config().setString(name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(const std::vector<std::string>& args)
|
||||||
|
{
|
||||||
|
if (_helpRequested)
|
||||||
|
return Application::EXIT_OK;
|
||||||
|
|
||||||
|
for (std::vector<std::string>::const_iterator it = args.begin(); it != args.end(); ++it)
|
||||||
|
{
|
||||||
|
compile(*it);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Application::EXIT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile(const std::string& path)
|
||||||
|
{
|
||||||
|
Page page(path);
|
||||||
|
|
||||||
|
FileInputStream srcStream(path);
|
||||||
|
page.parse(srcStream);
|
||||||
|
|
||||||
|
Path p(path);
|
||||||
|
config().setString("inputFileName", p.getFileName());
|
||||||
|
config().setString("inputFilePath", p.toString());
|
||||||
|
|
||||||
|
DateTime now;
|
||||||
|
config().setString("dateTime", DateTimeFormatter::format(now, DateTimeFormat::SORTABLE_FORMAT));
|
||||||
|
|
||||||
|
std::string clazz;
|
||||||
|
if (page.has("page.class"))
|
||||||
|
{
|
||||||
|
clazz = page.get("page.class");
|
||||||
|
p.setBaseName(clazz);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
clazz = p.getBaseName() + "Handler";
|
||||||
|
clazz[0] = std::toupper(clazz[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
p.setExtension("h");
|
||||||
|
std::string headerPath = p.toString();
|
||||||
|
std::string headerFileName = p.getFileName();
|
||||||
|
config().setString("outputFileName", p.getFileName());
|
||||||
|
config().setString("outputFilePath", headerPath);
|
||||||
|
FileOutputStream headerStream(headerPath);
|
||||||
|
OutputLineEndingConverter headerLEC(headerStream);
|
||||||
|
writeHeader(headerLEC, page, clazz, p.getFileName());
|
||||||
|
|
||||||
|
p.setExtension("cpp");
|
||||||
|
std::string implPath = p.toString();
|
||||||
|
config().setString("outputFileName", p.getFileName());
|
||||||
|
config().setString("outputFilePath", implPath);
|
||||||
|
FileOutputStream implStream(implPath);
|
||||||
|
OutputLineEndingConverter implLEC(implStream);
|
||||||
|
writeImpl(implLEC, page, clazz, headerFileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeHeader(std::ostream& ostr, Page& page, const std::string& clazz, const std::string& headerFileName)
|
||||||
|
{
|
||||||
|
std::string fileHeader = config().getString("PageCompiler.fileHeader", "");
|
||||||
|
if (!fileHeader.empty())
|
||||||
|
{
|
||||||
|
ostr << fileHeader << std::endl;
|
||||||
|
ostr << "\n\n";
|
||||||
|
}
|
||||||
|
Path p(headerFileName);
|
||||||
|
std::string guard(p.getBaseName());
|
||||||
|
guard += "_INCLUDED";
|
||||||
|
ostr << "#ifndef " << guard << "\n";
|
||||||
|
ostr << "#define " << guard << "\n";
|
||||||
|
ostr << "\n\n";
|
||||||
|
ostr << "#include \"Poco/Net/HTTPRequestHandler.h\"\n";
|
||||||
|
|
||||||
|
if (_generateOSPCode)
|
||||||
|
{
|
||||||
|
ostr << "#include \"Poco/OSP/Web/WebRequestHandlerFactory.h\"\n";
|
||||||
|
ostr << "#include \"Poco/OSP/BundleContext.h\"\n";
|
||||||
|
}
|
||||||
|
else if (_generateApacheCode)
|
||||||
|
{
|
||||||
|
ostr << "#include \"Poco/Net/HTTPRequestHandlerFactory.h\"\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
ostr << "\n\n";
|
||||||
|
|
||||||
|
const std::string& decls = page.headerDecls();
|
||||||
|
if (!decls.empty())
|
||||||
|
{
|
||||||
|
ostr << decls;
|
||||||
|
ostr << "\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
beginNamespace(ostr, page);
|
||||||
|
|
||||||
|
std::string base(page.get("page.baseClass", "Poco::Net::HTTPRequestHandler"));
|
||||||
|
std::string ctorArg;
|
||||||
|
if (_generateOSPCode)
|
||||||
|
ctorArg = "Poco::OSP::BundleContext::Ptr";
|
||||||
|
else
|
||||||
|
ctorArg = page.get("page.ctorArg", "");
|
||||||
|
|
||||||
|
std::string exprt(page.get("page.export", ""));
|
||||||
|
if (!exprt.empty()) exprt += ' ';
|
||||||
|
|
||||||
|
ostr << "class " << exprt << clazz << ": public " << base << "\n";
|
||||||
|
ostr << "{\n";
|
||||||
|
ostr << "public:\n";
|
||||||
|
if (!ctorArg.empty())
|
||||||
|
{
|
||||||
|
ostr << "\t" << clazz << "(" << ctorArg << ");\n";
|
||||||
|
ostr << "\n";
|
||||||
|
}
|
||||||
|
ostr << "\tvoid handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response);\n";
|
||||||
|
|
||||||
|
if (_generateOSPCode)
|
||||||
|
writeOSPHeader(ostr);
|
||||||
|
|
||||||
|
ostr << "};\n";
|
||||||
|
|
||||||
|
if (_generateOSPCode)
|
||||||
|
{
|
||||||
|
ostr << "\n\n";
|
||||||
|
writeFactoryHeader(ostr, page, clazz, "Poco::OSP::Web::WebRequestHandlerFactory");
|
||||||
|
}
|
||||||
|
else if (_generateApacheCode)
|
||||||
|
{
|
||||||
|
ostr << "\n\n";
|
||||||
|
writeFactoryHeader(ostr, page, clazz, "Poco::Net::HTTPRequestHandlerFactory");
|
||||||
|
}
|
||||||
|
|
||||||
|
endNamespace(ostr, page);
|
||||||
|
|
||||||
|
ostr << "\n\n";
|
||||||
|
ostr << "#endif // " << guard << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeImpl(std::ostream& ostr, Page& page, const std::string& clazz, const std::string& headerFileName)
|
||||||
|
{
|
||||||
|
std::string fileHeader = config().getString("PageCompiler.fileHeader", "");
|
||||||
|
if (!fileHeader.empty())
|
||||||
|
{
|
||||||
|
ostr << fileHeader << std::endl;
|
||||||
|
ostr << "\n\n";
|
||||||
|
}
|
||||||
|
ostr << "#include \"" << headerFileName << "\"\n";
|
||||||
|
ostr << "#include \"Poco/Net/HTTPServerRequest.h\"\n";
|
||||||
|
ostr << "#include \"Poco/Net/HTTPServerResponse.h\"\n";
|
||||||
|
ostr << "#include \"Poco/Net/HTMLForm.h\"\n";
|
||||||
|
|
||||||
|
if (_generateOSPCode)
|
||||||
|
{
|
||||||
|
if (page.has("page.session"))
|
||||||
|
{
|
||||||
|
ostr << "#include \"Poco/OSP/Web/WebSession.h\"\n";
|
||||||
|
ostr << "#include \"Poco/OSP/Web/WebSessionManager.h\"\n";
|
||||||
|
ostr << "#include \"Poco/OSP/ServiceRegistry.h\"\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (_generateApacheCode)
|
||||||
|
{
|
||||||
|
ostr << "#include \"Poco/ClassLibrary.h\"\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
ostr << "\n\n";
|
||||||
|
|
||||||
|
const std::string& decls = page.implDecls();
|
||||||
|
if (!decls.empty())
|
||||||
|
{
|
||||||
|
ostr << decls;
|
||||||
|
ostr << "\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
beginNamespace(ostr, page);
|
||||||
|
|
||||||
|
Path p(headerFileName);
|
||||||
|
std::string base(page.get("page.baseClass", "Poco::Net::HTTPRequestHandler"));
|
||||||
|
std::string ctorArg(page.get("page.ctorArg", ""));
|
||||||
|
|
||||||
|
if (_generateOSPCode)
|
||||||
|
{
|
||||||
|
ostr << clazz << "::" << clazz << "(Poco::OSP::BundleContext::Ptr pContext):\n";
|
||||||
|
ostr << "\t_pContext(pContext)\n";
|
||||||
|
ostr << "{\n}\n";
|
||||||
|
ostr << "\n\n";
|
||||||
|
}
|
||||||
|
else if (!ctorArg.empty())
|
||||||
|
{
|
||||||
|
ostr << clazz << "::" << clazz << "(" << ctorArg << " arg):\n";
|
||||||
|
ostr << "\t" << base << "(arg)\n";
|
||||||
|
ostr << "{\n}\n";
|
||||||
|
ostr << "\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
ostr << "void " << clazz << "::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response)\n";
|
||||||
|
ostr << "{\n";
|
||||||
|
|
||||||
|
if (_generateOSPCode && page.has("page.session"))
|
||||||
|
{
|
||||||
|
writeOSPSession(ostr, page);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (page.get("page.form", "true") != "false")
|
||||||
|
{
|
||||||
|
std::string partHandler(page.get("page.formPartHandler", ""));
|
||||||
|
if (!partHandler.empty())
|
||||||
|
{
|
||||||
|
ostr << "\t" << partHandler << " cpspPartHandler(*this);\n";
|
||||||
|
}
|
||||||
|
ostr << "\tPoco::Net::HTMLForm form(request, request.stream()";
|
||||||
|
if (!partHandler.empty())
|
||||||
|
{
|
||||||
|
ostr << ", cpspPartHandler";
|
||||||
|
}
|
||||||
|
ostr << ");\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string contentType(page.get("page.contentType", "text/html"));
|
||||||
|
std::string chunked(page.get("page.chunked", "true"));
|
||||||
|
|
||||||
|
if (chunked != "false")
|
||||||
|
{
|
||||||
|
ostr << "\tresponse.setChunkedTransferEncoding(true);\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
ostr << "\tresponse.setContentType(\"" << contentType << "\");\n";
|
||||||
|
ostr << "\n";
|
||||||
|
|
||||||
|
ostr << "\tstd::ostream& ostr = response.send();\n";
|
||||||
|
ostr << page.handler();
|
||||||
|
|
||||||
|
ostr << "}\n";
|
||||||
|
|
||||||
|
if (_generateOSPCode)
|
||||||
|
{
|
||||||
|
ostr << "\n\n";
|
||||||
|
writeFactoryImpl(ostr, page, clazz, "context()");
|
||||||
|
}
|
||||||
|
else if (_generateApacheCode)
|
||||||
|
{
|
||||||
|
ostr << "\n\n";
|
||||||
|
writeFactoryImpl(ostr, page, clazz, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
endNamespace(ostr, page);
|
||||||
|
|
||||||
|
if (_generateApacheCode)
|
||||||
|
writeManifest(ostr, page, clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
void beginNamespace(std::ostream& ostr, Page& page)
|
||||||
|
{
|
||||||
|
std::string ns = page.get("page.namespace", "");
|
||||||
|
if (!ns.empty())
|
||||||
|
{
|
||||||
|
StringTokenizer tok(ns, ":", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
|
||||||
|
for (StringTokenizer::Iterator it = tok.begin(); it != tok.end(); ++it)
|
||||||
|
{
|
||||||
|
ostr << "namespace " << *it << " {\n";
|
||||||
|
}
|
||||||
|
ostr << "\n\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void endNamespace(std::ostream& ostr, Page& page)
|
||||||
|
{
|
||||||
|
std::string ns = page.get("page.namespace", "");
|
||||||
|
if (!ns.empty())
|
||||||
|
{
|
||||||
|
ostr << "\n\n";
|
||||||
|
StringTokenizer tok(ns, ":", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
|
||||||
|
for (StringTokenizer::Iterator it = tok.begin(); it != tok.end(); ++it)
|
||||||
|
{
|
||||||
|
ostr << "} ";
|
||||||
|
}
|
||||||
|
ostr << "// namespace " << ns << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeOSPSession(std::ostream& ostr, Page& page)
|
||||||
|
{
|
||||||
|
ostr << "\tPoco::OSP::Web::WebSession::Ptr session;\n";
|
||||||
|
ostr << "\t{\n";
|
||||||
|
ostr << "\t\tPoco::OSP::ServiceRef::Ptr pWebSessionManagerRef = context()->registry().findByName(Poco::OSP::Web::WebSessionManager::SERVICE_NAME);\n";
|
||||||
|
ostr << "\t\tif (pWebSessionManagerRef)\n";
|
||||||
|
ostr << "\t\t{\n";
|
||||||
|
ostr << "\t\t\tPoco::OSP::Web::WebSessionManager::Ptr pWebSessionManager = pWebSessionManagerRef->castedInstance<Poco::OSP::Web::WebSessionManager>();\n";
|
||||||
|
ostr << "\t\t\tsession = pWebSessionManager->find(\"" << page.get("page.session") << "\", request);\n";
|
||||||
|
ostr << "\t\t\tif (session.isNull())\n";
|
||||||
|
ostr << "\t\t\t\tsession = pWebSessionManager->get(\"" << page.get("page.session") << "\", request, " << page.get("page.sessionTimeout", "30") << ", context());\n";
|
||||||
|
ostr << "\t\t}\n";
|
||||||
|
ostr << "\t}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeOSPHeader(std::ostream& ostr)
|
||||||
|
{
|
||||||
|
ostr << "\n";
|
||||||
|
ostr << "protected:\n";
|
||||||
|
ostr << "\tPoco::OSP::BundleContext::Ptr context() const\n";
|
||||||
|
ostr << "\t{\n";
|
||||||
|
ostr << "\t\treturn _pContext;\n";
|
||||||
|
ostr << "\t}\n";
|
||||||
|
ostr << "\n";
|
||||||
|
ostr << "private:\n";
|
||||||
|
ostr << "\tPoco::OSP::BundleContext::Ptr _pContext;\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeFactoryHeader(std::ostream& ostr, Page& page, const std::string& clazz, const std::string& base)
|
||||||
|
{
|
||||||
|
ostr << "class " << clazz << "Factory: public " << base << "\n";
|
||||||
|
ostr << "{\n";
|
||||||
|
ostr << "public:\n";
|
||||||
|
ostr << "\tPoco::Net::HTTPRequestHandler* createRequestHandler(const Poco::Net::HTTPServerRequest& request);\n";
|
||||||
|
ostr << "};\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeFactoryImpl(std::ostream& ostr, Page& page, const std::string& clazz, const std::string& arg)
|
||||||
|
{
|
||||||
|
ostr << "Poco::Net::HTTPRequestHandler* " << clazz << "Factory::createRequestHandler(const Poco::Net::HTTPServerRequest& request)\n";
|
||||||
|
ostr << "{\n";
|
||||||
|
ostr << "\treturn new " << clazz << "(" << arg << ");\n";
|
||||||
|
ostr << "}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeManifest(std::ostream& ostr, Page& page, const std::string& clazz)
|
||||||
|
{
|
||||||
|
std::string ns = page.get("page.namespace", "");
|
||||||
|
if (!ns.empty()) ns += "::";
|
||||||
|
ostr << "\n\n";
|
||||||
|
ostr << "POCO_BEGIN_MANIFEST(Poco::Net::HTTPRequestHandlerFactory)\n";
|
||||||
|
ostr << "\tPOCO_EXPORT_CLASS(" << ns << clazz << "Factory)\n";
|
||||||
|
ostr << "POCO_END_MANIFEST\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool _helpRequested;
|
||||||
|
bool _generateOSPCode;
|
||||||
|
bool _generateApacheCode;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
POCO_APP_MAIN(CompilerApp)
|
||||||
3
PageCompiler/test/header.inc
Normal file
3
PageCompiler/test/header.inc
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<h1>This is the header</h1>
|
||||||
|
<p>Just to test the include statement</p>
|
||||||
|
<%@ foo bar="asdf"%>
|
||||||
27
PageCompiler/test/test.cpsp
Normal file
27
PageCompiler/test/test.cpsp
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<%@ page class="TestHandler" namespace="AI::Test" session="test"%>
|
||||||
|
<%!
|
||||||
|
#include "Poco/DateTime.h"
|
||||||
|
#include "Poco/DateTimeFormatter.h"
|
||||||
|
#include "Poco/DateTimeFormat.h"
|
||||||
|
|
||||||
|
|
||||||
|
using Poco::DateTime;
|
||||||
|
using Poco::DateTimeFormatter;
|
||||||
|
using Poco::DateTimeFormat;
|
||||||
|
%>
|
||||||
|
|
||||||
|
<%
|
||||||
|
DateTime now;
|
||||||
|
std::string dt(DateTimeFormatter::format(now, DateTimeFormat::SORTABLE_FORMAT));
|
||||||
|
%>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Test Page</title>
|
||||||
|
</head>
|
||||||
|
<%-- This is a server-side comment --%>
|
||||||
|
<body>
|
||||||
|
<%@ include page="header.inc" %>
|
||||||
|
<h1>Hello, World!</h1>
|
||||||
|
<p><%= dt %></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user