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