Add a static buffer transform source.

git-svn-id: https://svn.apache.org/repos/asf/santuario/xml-security-cpp/trunk@1826173 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/Projects/VC15.0/xsec/xsec_lib/xsec_lib.vcxproj b/Projects/VC15.0/xsec/xsec_lib/xsec_lib.vcxproj
index 687ecfb..cf24ea1 100644
--- a/Projects/VC15.0/xsec/xsec_lib/xsec_lib.vcxproj
+++ b/Projects/VC15.0/xsec/xsec_lib/xsec_lib.vcxproj
@@ -504,6 +504,7 @@
     <ClCompile Include="..\..\..\..\xsec\enc\OpenSSL\OpenSSLCryptoSymmetricKey.cpp" />

     <ClCompile Include="..\..\..\..\xsec\enc\OpenSSL\OpenSSLCryptoX509.cpp" />

     <ClCompile Include="..\..\..\..\xsec\enc\XSCrypt\XSCryptCryptoBase64.cpp" />

+    <ClCompile Include="..\..\..\..\xsec\transformers\TXFMChar.cpp" />

     <ClCompile Include="..\..\..\..\xsec\transformers\TXFMHash.cpp" />

     <ClCompile Include="..\..\..\..\xsec\utils\winutils\XSECSOAPRequestorSimpleWin32.cpp">

       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release Minimal|Win32'">true</ExcludedFromBuild>

@@ -663,6 +664,7 @@
     <ClInclude Include="..\..\..\..\xsec\enc\OpenSSL\OpenSSLCryptoX509.hpp" />

     <ClInclude Include="..\..\..\..\xsec\enc\XSCrypt\XSCryptCryptoBase64.hpp" />

     <ClInclude Include="..\..\..\..\xsec\framework\XSECVersion.hpp" />

+    <ClInclude Include="..\..\..\..\xsec\transformers\TXFMChar.hpp" />

     <ClInclude Include="..\..\..\..\xsec\transformers\TXFMHash.hpp" />

     <ClInclude Include="..\..\..\..\xsec\utils\XSECAlgorithmSupport.hpp" />

     <ClInclude Include="..\..\..\..\xsec\utils\XSECAutoPtr.hpp" />

diff --git a/Projects/VC15.0/xsec/xsec_lib/xsec_lib.vcxproj.filters b/Projects/VC15.0/xsec/xsec_lib/xsec_lib.vcxproj.filters
index 95de2b7..35252f5 100644
--- a/Projects/VC15.0/xsec/xsec_lib/xsec_lib.vcxproj.filters
+++ b/Projects/VC15.0/xsec/xsec_lib/xsec_lib.vcxproj.filters
@@ -430,6 +430,9 @@
     <ClCompile Include="..\..\..\..\xsec\utils\XSECXPathNodeList.cpp">

       <Filter>utils</Filter>

     </ClCompile>

+    <ClCompile Include="..\..\..\..\xsec\transformers\TXFMChar.cpp">

+      <Filter>transformers</Filter>

+    </ClCompile>

   </ItemGroup>

   <ItemGroup>

     <ClInclude Include="..\..\..\..\xsec\dsig\DSIGAlgorithmHandlerDefault.hpp">

@@ -1050,6 +1053,9 @@
     <ClInclude Include="..\..\..\..\xsec\framework\resource.h">

       <Filter>framework</Filter>

     </ClInclude>

+    <ClInclude Include="..\..\..\..\xsec\transformers\TXFMChar.hpp">

+      <Filter>transformers</Filter>

+    </ClInclude>

   </ItemGroup>

   <ItemGroup>

     <Filter Include="dsig">

diff --git a/xsec/Makefile.am b/xsec/Makefile.am
index 597872a..1f00ee4 100644
--- a/xsec/Makefile.am
+++ b/xsec/Makefile.am
@@ -245,6 +245,7 @@
   transformers/TXFMOutputFile.hpp \
   transformers/TXFMURL.hpp \
   transformers/TXFMBase.hpp \
+  transformers/TXFMChar.hpp \
   transformers/TXFMCipher.hpp \
   transformers/TXFMEnvelope.hpp \
   transformers/TXFMChain.hpp \
@@ -445,7 +446,8 @@
   transformers/TXFMXPath.cpp \
   transformers/TXFMXSL.cpp \
   transformers/TXFMDocObject.cpp \
-  transformers/TXFMConcatChains.cpp
+  transformers/TXFMConcatChains.cpp \
+  transformers/TXFMChar.cpp
 
 # Utility files.  Note we don't worry about checking
 # if the UNIX stuff is necessary - we just assume that
diff --git a/xsec/transformers/TXFMChar.cpp b/xsec/transformers/TXFMChar.cpp
new file mode 100644
index 0000000..ae22bd1
--- /dev/null
+++ b/xsec/transformers/TXFMChar.cpp
@@ -0,0 +1,122 @@
+/**

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements. See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership. The ASF licenses this file

+ * to you under the Apache License, Version 2.0 (the

+ * "License"); you may not use this file except in compliance

+ * with the License. You may obtain a copy of the License at

+ *

+ * http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing,

+ * software distributed under the License is distributed on an

+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+ * KIND, either express or implied. See the License for the

+ * specific language governing permissions and limitations

+ * under the License.

+ */

+

+/*

+ * XSEC

+ *

+ * TXFMChar := Class that takes an input static buffer to start a transform pipe

+ *

+ */

+

+#include <xsec/transformers/TXFMChar.hpp>

+

+XERCES_CPP_NAMESPACE_USE

+

+// General includes 

+

+#include <memory.h>

+

+TXFMChar::TXFMChar(DOMDocument *doc) : TXFMBase(doc) {

+

+	toOutput = 0;

+}

+

+

+TXFMChar::~TXFMChar() {

+

+}

+

+// Methods to set the inputs

+

+void TXFMChar::setInput(TXFMBase *newInput) {

+

+	// We're the start of the actual data pipe, but we need to track

+    // the pointer for chain disposal.

+    input = newInput;

+

+	return;

+}

+

+void TXFMChar::setInput(const char* in) {

+

+	// Assume this is a string

+

+	buf = in;

+	toOutput = in ? strlen(in) : 0;

+	sbs = toOutput;

+

+}

+

+void TXFMChar::setInput(const char* in, unsigned int bSize) {

+

+	// Assume this is a string

+

+	buf = in;

+	if (bSize > (in ? strlen(in) : 0))

+		toOutput = in ? strlen(in) : 0;

+	else

+		toOutput = bSize;

+	sbs = toOutput;

+

+}

+

+

+// Methods to get tranform output type and input requirement

+

+TXFMBase::ioType TXFMChar::getInputType() const {

+	return TXFMBase::BYTE_STREAM;

+}

+

+TXFMBase::ioType TXFMChar::getOutputType() const {

+	return TXFMBase::BYTE_STREAM;

+}

+

+

+TXFMBase::nodeType TXFMChar::getNodeType() const {

+	return TXFMBase::DOM_NODE_NONE;

+}

+

+// Methods to get output data

+

+unsigned int TXFMChar::readBytes(XMLByte* const toFill, unsigned int maxToFill) {

+	

+	// Return from the buffer

+	

+	unsigned int ret;

+

+	if (toOutput == 0)

+		return 0;

+

+	// Check if we can just output everything left

+	if (toOutput <= maxToFill) {

+

+		memcpy((char *) toFill, &(buf[sbs - toOutput]), toOutput);

+		ret = (unsigned int) toOutput;

+		toOutput = 0;

+		return ret;

+	}

+

+	// Output just some

+

+	memcpy((char *) toFill, &(buf[sbs - toOutput]), maxToFill);

+	ret = maxToFill;

+	toOutput -= maxToFill;

+

+	return ret;

+}

diff --git a/xsec/transformers/TXFMChar.hpp b/xsec/transformers/TXFMChar.hpp
new file mode 100644
index 0000000..9e0ed03
--- /dev/null
+++ b/xsec/transformers/TXFMChar.hpp
@@ -0,0 +1,70 @@
+/**

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements. See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership. The ASF licenses this file

+ * to you under the Apache License, Version 2.0 (the

+ * "License"); you may not use this file except in compliance

+ * with the License. You may obtain a copy of the License at

+ *

+ * http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing,

+ * software distributed under the License is distributed on an

+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+ * KIND, either express or implied. See the License for the

+ * specific language governing permissions and limitations

+ * under the License.

+ */

+

+/*

+ * XSEC

+ *

+ * TXFMChar := Class that takes an input from a static buffer to start a pipe

+ *

+ */

+

+#ifndef TXFMCHAR_INCLUDE

+#define TXFMCHAR_INCLUDE

+

+#include <xsec/transformers/TXFMBase.hpp>

+

+/**

+ * \brief Base transformer to start a chain from a static buffer

+ * @ingroup internal

+ */

+

+class XSEC_EXPORT TXFMChar : public TXFMBase {

+

+private:

+

+	const char*	buf;	// Buffer to use

+	XMLSize_t toOutput;	// Amount left to output

+	XMLSize_t sbs;		// Size of raw buffer

+

+public:

+

+	TXFMChar(XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc);

+	virtual ~TXFMChar();

+

+	// Methods to set the inputs

+

+	virtual void setInput(TXFMBase *newInput);

+	void setInput(const char* in);

+	void setInput(const char* in, unsigned int bufSize);

+

+	// Methods to get tranform output type and input requirement

+

+	virtual TXFMBase::ioType getInputType() const;

+	virtual TXFMBase::ioType getOutputType() const;

+	virtual nodeType getNodeType() const;

+

+	// Methods to get output data

+

+	virtual unsigned int readBytes(XMLByte* const toFill, const unsigned int maxToFill);

+	

+private:

+	TXFMChar();

+};

+

+#endif