1 /**
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied. See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  */
19 
20 /*
21  * XSEC
22  *
23  * XSECSafeBufferFormatter := Class for formatting DOMStrings into SafeBuffers
24  *
25  * Author(s): Berin Lautenbach
26  *
27  * $Id: XSECSafeBufferFormatter.hpp 1808174 2017-09-12 21:50:30Z scantor $
28  *
29  */
30 
31 #ifndef XSECSAFEBUFFERFORMATTER_INCLUDE
32 #define XSECSAFEBUFFERFORMATTER_INCLUDE
33 
34 // XSEC includes
35 
36 #include <xsec/utils/XSECSafeBuffer.hpp>
37 
38 // Xerces includes
39 
40 #include <xercesc/framework/XMLFormatter.hpp>
41 
42 /** @addtogroup internal
43   * @{
44   */
45 
46 class sbFormatTarget : public XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatTarget
47 {
48 public:
49 
sbFormatTarget()50 	sbFormatTarget()  {m_offset = 0;}
~sbFormatTarget()51     ~sbFormatTarget() {}
52 
setBuffer(safeBuffer * toSet)53 	void setBuffer (safeBuffer * toSet) {m_buffer = toSet;};
54 
55 
56     // -----------------------------------------------------------------------
57     //  Implementations of the format target interface
58 	//  Based on Xerces/Xalan example code
59     // -----------------------------------------------------------------------
60 
writeChars(const XMLByte * const toWrite,const XMLSize_t count,XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter * const formatter)61     void writeChars(const   XMLByte* const  toWrite,
62                     const XMLSize_t    count,
63                     XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter * const formatter)
64     {
65          m_buffer->sbMemcpyIn(m_offset, (char *) toWrite, count);
66 		 m_buffer->setBufferType(safeBuffer::BUFFER_CHAR);
67 		 m_offset += count;
68 		(*m_buffer)[m_offset] = '\0';
69     };
70 
reset(void)71 	void reset(void) {m_offset = 0;(*m_buffer)[0] = '\0';}
72 
73 private:
74 
75     sbFormatTarget(const sbFormatTarget& other);
76     void operator=(const sbFormatTarget& rhs);
77 
78 	safeBuffer					* m_buffer;		// Buffer to write to
79 	XMLSize_t				      m_offset;
80 };
81 
82 /**
83  * \brief Formatter for outputting to a safeBuffer
84  *
85  * The XSECSafeBufferFormatter class is used as an internal class
86  * to perform encoding translations with a safeBuffer as a target
87  */
88 
89 class XSEC_EXPORT XSECSafeBufferFormatter {
90 
91 	XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter
92 						* formatter;		// To actually perform the formatting
93 	safeBuffer			formatBuffer;		// Storage of translated strings
94 	sbFormatTarget		* sbf;				// Format target used by XMLFormatter
95 
96 public:
97 
98 	// Constructor
99 
100 	XSECSafeBufferFormatter(
101 		const XMLCh * const						outEncoding,
102 		const XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::EscapeFlags
103 				escapeFlags=XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::NoEscapes,
104 		const XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::UnRepFlags
105 				unrepFlags=XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::UnRep_Fail
106 	);
107 
108 	XSECSafeBufferFormatter(
109 		const char * const						outEncoding,
110 		const XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::EscapeFlags
111 				escapeFlags=XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::NoEscapes,
112 		const XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::UnRepFlags
113 				unrepFlags=XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::UnRep_Fail
114 	);
115 
116 	// Destructor
117 
118 	~XSECSafeBufferFormatter();
119 
120 	// Reimplementation of XMLFormatter functions
121 
122 	void  formatBuf (
123 		const XMLCh *const toFormat,
124 		const XMLSize_t count,
125 		const XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::EscapeFlags
126 				escapeFlags=XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::DefaultEscape,
127 		const XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::UnRepFlags
128 				unrepFlags=XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::DefaultUnRep
129 	);		// Format a buffer
130 
131 	XSECSafeBufferFormatter&  operator<< (
132 		const XMLCh *const toFormat);					// Format a buffer
133 
134 	XSECSafeBufferFormatter&  operator<< (
135 		const XMLCh toFormat);							// Format a character
136 
137 	const XMLCh*  getEncodingName ()const;				// Get current encoding
138 
139 	void  setEscapeFlags (const XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::EscapeFlags newFlags);
140 	void  setUnRepFlags (const XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::UnRepFlags newFlags);
141 
142 	XSECSafeBufferFormatter&  operator<< (const XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::EscapeFlags newFlags);
143 	XSECSafeBufferFormatter&  operator<< (const XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::UnRepFlags newFlags);
144 
145 	// Friends for working with safestrings
146 
147 	friend safeBuffer& operator<< (safeBuffer &to, const XSECSafeBufferFormatter & from);
148 
149 private:
150 
151 	// Unimplemented
152 
XSECSafeBufferFormatter()153 	XSECSafeBufferFormatter() {};
154 
155 
156 };
157 
158 /** @} */
159 
160 #endif /* XSECSAFEBUFFERFORMATTER_INCLUDE */
161