1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_xmloff.hxx" 30 #include "MutableAttrList.hxx" 31 #include "xmloff/xmlnmspe.hxx" 32 #include <xmloff/nmspmap.hxx> 33 #include "ActionMapTypesOASIS.hxx" 34 #include "AttrTransformerAction.hxx" 35 #include "TransformerActions.hxx" 36 #ifndef _XMLOFF_TRANSFORMERBASE_HXX 37 #include "TransformerBase.hxx" 38 #endif 39 #include "FormPropOASISTContext.hxx" 40 41 using ::rtl::OUString; 42 using namespace ::com::sun::star::uno; 43 using namespace ::com::sun::star::xml::sax; 44 using namespace ::xmloff::token; 45 46 TYPEINIT1( XMLFormPropOASISTransformerContext, 47 XMLRenameElemTransformerContext ); 48 49 XMLTokenEnum XMLFormPropOASISTransformerContext::GetValueType( 50 const OUString& rValue ) 51 { 52 XMLTokenEnum eRet = XML_DOUBLE; 53 sal_Bool bNeg = sal_False; 54 sal_uInt32 nVal = 0; 55 56 sal_Int32 nPos = 0; 57 sal_Int32 nLen = rValue.getLength(); 58 59 // skip white space 60 while( nPos < nLen && sal_Unicode(' ') == rValue[nPos] ) 61 nPos++; 62 63 if( nPos < nLen && sal_Unicode('-') == rValue[nPos] ) 64 { 65 bNeg = sal_True; 66 nPos++; 67 } 68 69 // get number 70 sal_Bool bOverflow = sal_False; 71 while( nPos < nLen && 72 sal_Unicode('0') <= rValue[nPos] && 73 sal_Unicode('9') >= rValue[nPos] ) 74 { 75 nVal *= 10; 76 nVal += (rValue[nPos] - sal_Unicode('0')); 77 bOverflow |= (nVal > (bNeg ? 2147483648UL : 2147483647UL)); 78 nPos++; 79 } 80 81 // skip white space 82 while( nPos < nLen && sal_Unicode(' ') == rValue[nPos] ) 83 nPos++; 84 85 if( nPos == nLen ) 86 { 87 // It's a integer number 88 if( bOverflow ) 89 eRet = XML_LONG; 90 else if( nVal > (bNeg ? 32768UL : 32767UL) ) 91 eRet = XML_INT; 92 else 93 eRet = XML_SHORT; 94 } 95 96 return eRet; 97 } 98 99 XMLFormPropOASISTransformerContext::XMLFormPropOASISTransformerContext( 100 XMLTransformerBase& rImp, 101 const OUString& rQName, 102 XMLTokenEnum eLocalName ) : 103 XMLRenameElemTransformerContext( rImp, rQName, XML_NAMESPACE_FORM, 104 XML_PROPERTY ), 105 m_bIsList( XML_LIST_PROPERTY == eLocalName), 106 m_bIsListValue( XML_LIST_VALUE == eLocalName) 107 { 108 } 109 110 XMLFormPropOASISTransformerContext::~XMLFormPropOASISTransformerContext() 111 { 112 } 113 114 void XMLFormPropOASISTransformerContext::StartElement( 115 const Reference< XAttributeList >& rAttrList ) 116 { 117 118 XMLTransformerActions *pActions = 119 GetTransformer().GetUserDefinedActions( OASIS_FORM_PROP_ACTIONS ); 120 OSL_ENSURE( pActions, "go no actions" ); 121 122 XMLMutableAttributeList *pMutableAttrList = 123 new XMLMutableAttributeList( rAttrList ); 124 Reference< XAttributeList > xAttrList( pMutableAttrList ); 125 126 sal_Int16 nValueTypeAttr = -1; 127 OUString aValue; 128 sal_Bool bIsVoid = sal_False; 129 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 130 for( sal_Int16 i=0; i < nAttrCount; i++ ) 131 { 132 const OUString& rAttrName = xAttrList->getNameByIndex( i ); 133 OUString aLocalName; 134 sal_uInt16 nPrefix = 135 GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName, 136 &aLocalName ); 137 XMLTransformerActions::key_type aKey( nPrefix, aLocalName ); 138 XMLTransformerActions::const_iterator aIter = 139 pActions->find( aKey ); 140 if( !(aIter == pActions->end() ) ) 141 { 142 const OUString& rAttrValue = xAttrList->getValueByIndex( i ); 143 switch( (*aIter).second.m_nActionType ) 144 { 145 case XML_ATACTION_RENAME: 146 if( IsXMLToken( aLocalName, XML_VALUE_TYPE ) ) 147 { 148 if( IsXMLToken( rAttrValue, XML_FLOAT ) ) 149 { 150 nValueTypeAttr = i; 151 } 152 else if( IsXMLToken( rAttrValue, XML_VOID ) ) 153 { 154 pMutableAttrList->SetValueByIndex( i, 155 GetXMLToken( XML_SHORT ) ); 156 bIsVoid = sal_True; 157 } 158 } 159 { 160 OUString aNewAttrQName( 161 GetTransformer().GetNamespaceMap().GetQNameByKey( 162 (*aIter).second.GetQNamePrefixFromParam1(), 163 ::xmloff::token::GetXMLToken( 164 (*aIter).second.GetQNameTokenFromParam1()) ) ); 165 pMutableAttrList->RenameAttributeByIndex( i, aNewAttrQName ); 166 } 167 break; 168 case XML_ATACTION_REMOVE: 169 if( !IsXMLToken( aLocalName, XML_CURRENCY ) ) 170 aValue = rAttrValue; 171 pMutableAttrList->RemoveAttributeByIndex( i ); 172 --i; 173 --nAttrCount; 174 break; 175 default: 176 OSL_ENSURE( !this, "unknown action" ); 177 break; 178 } 179 } 180 } 181 if( m_bIsList ) 182 { 183 OUString aNewAttrQName( 184 GetTransformer().GetNamespaceMap().GetQNameByKey( 185 XML_NAMESPACE_FORM, 186 GetXMLToken( XML_PROPERTY_IS_LIST ) ) ); 187 pMutableAttrList->AddAttribute( aNewAttrQName, 188 GetXMLToken( XML_TRUE ) ); 189 } 190 191 if( nValueTypeAttr != -1 ) 192 pMutableAttrList->SetValueByIndex( nValueTypeAttr, 193 GetXMLToken( GetValueType( aValue ) ) ); 194 195 if( !m_bIsListValue ) 196 XMLRenameElemTransformerContext::StartElement( xAttrList ); 197 if( !m_bIsList ) 198 { 199 pMutableAttrList = 200 new XMLMutableAttributeList; 201 xAttrList = pMutableAttrList; 202 if( bIsVoid ) 203 { 204 OUString aNewAttrQName( 205 GetTransformer().GetNamespaceMap().GetQNameByKey( 206 XML_NAMESPACE_FORM, GetXMLToken( XML_PROPERTY_IS_VOID ) ) ); 207 pMutableAttrList->AddAttribute( aNewAttrQName, 208 GetXMLToken( XML_TRUE ) ); 209 } 210 211 OUString aValueElemQName( 212 GetTransformer().GetNamespaceMap().GetQNameByKey( 213 XML_NAMESPACE_FORM, GetXMLToken( XML_PROPERTY_VALUE ) ) ); 214 GetTransformer().GetDocHandler()->startElement( aValueElemQName, 215 xAttrList ); 216 GetTransformer().GetDocHandler()->characters( aValue ); 217 GetTransformer().GetDocHandler()->endElement( aValueElemQName ); 218 } 219 } 220 221 void XMLFormPropOASISTransformerContext::EndElement() 222 { 223 if( !m_bIsListValue ) 224 XMLRenameElemTransformerContext::EndElement(); 225 } 226