1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_forms.hxx" 26 27 #include "xmlhelper.hxx" 28 29 #include "unohelper.hxx" 30 #include <rtl/ustring.hxx> 31 #include <com/sun/star/uno/Reference.hxx> 32 #include <com/sun/star/xml/dom/XDocumentBuilder.hpp> 33 34 using rtl::OUString; 35 using com::sun::star::uno::Reference; 36 using com::sun::star::uno::UNO_QUERY_THROW; 37 using com::sun::star::container::XNameContainer; 38 using com::sun::star::xml::dom::XDocumentBuilder; 39 40 41 // 42 // determine valid XML name 43 // 44 45 // character class: 46 // 1: NameStartChar 47 // 2: NameChar 48 // 4: NCNameStartChar 49 // 8: NCNameChar 50 inline sal_uInt8 lcl_getCharClass( sal_Unicode c ) 51 { 52 sal_uInt8 nClass = 0; 53 54 // NameStartChar 55 if( (c >= 'A' && c <= 'Z') 56 || c == '_' 57 || (c >= 'a' && c <= 'z') 58 || (c >= 0x00C0 && c <= 0x00D6) 59 || (c >= 0x00D8 && c <= 0x00F6) 60 || (c >= 0x00F8 && c <= 0x02FF) 61 || (c >= 0x0370 && c <= 0x037D) 62 || (c >= 0x037F && c <= 0x1FFF) 63 || (c >= 0x200C && c <= 0x200D) 64 || (c >= 0x2070 && c <= 0x218F) 65 || (c >= 0x2C00 && c <= 0x2FEF) 66 || (c >= 0x3001 && c <= 0xD7FF) 67 || (c >= 0xF900 && c <= 0xFDCF) 68 || (c >= 0xFDF0 && c <= 0xFFFD) 69 70 // surrogates 71 || (c >= 0xD800 && c <= 0xDBFF) 72 || (c >= 0xDC00 && c <= 0xDFFF) ) 73 { 74 nClass = 15; 75 } 76 else if( c == '-' 77 || c == '.' 78 || (c >= '0' && c <= '9') 79 || (c == 0x00B7) 80 || (c >= 0x0300 && c <= 0x036F) 81 || (c >= 0x203F && c <= 0x2040) ) 82 { 83 nClass = 10; 84 } 85 else if( c == ':' ) 86 { 87 nClass = 3; 88 } 89 90 return nClass; 91 } 92 93 bool isValidQName( const OUString& sName, 94 const Reference<XNameContainer>& /*xNamespaces*/ ) 95 { 96 sal_Int32 nLength = sName.getLength(); 97 const sal_Unicode* pName = sName.getStr(); 98 99 bool bRet = false; 100 sal_Int32 nColon = 0; 101 if( nLength > 0 ) 102 { 103 bRet = ( ( lcl_getCharClass( pName[0] ) & 4 ) != 0 ); 104 for( sal_Int32 n = 1; n < nLength; n++ ) 105 { 106 sal_uInt8 nClass = lcl_getCharClass( pName[n] ); 107 bRet &= ( ( nClass & 2 ) != 0 ); 108 if( nClass == 3 ) 109 nColon++; 110 } 111 } 112 if( nColon > 1 ) 113 bRet = sal_False; 114 115 return bRet; 116 } 117 118 bool isValidPrefixName( const OUString& sName, 119 const Reference<XNameContainer>& /*xNamespaces*/ ) 120 { 121 sal_Int32 nLength = sName.getLength(); 122 const sal_Unicode* pName = sName.getStr(); 123 bool bRet = false; 124 125 if( nLength > 0 ) 126 { 127 bRet = ( ( lcl_getCharClass( pName[0] ) & 4 ) != 0 ); 128 for( sal_Int32 n = 1; n < nLength; n++ ) 129 bRet &= ( ( lcl_getCharClass( pName[n] ) & 8 ) != 0 ); 130 } 131 132 return bRet; 133 } 134 135 Reference<XDocumentBuilder> getDocumentBuilder() 136 { 137 Reference<XDocumentBuilder> xBuilder( 138 xforms::createInstance( 139 OUSTRING("com.sun.star.xml.dom.DocumentBuilder") ), 140 UNO_QUERY_THROW ); 141 OSL_ENSURE( xBuilder.is(), "no document builder?" ); 142 return xBuilder; 143 } 144 145