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 <com/sun/star/util/XCloneable.hpp>
31 #include "IgnoreTContext.hxx"
32 #ifndef _XMLOFF_TRANSFORMERBASE_HXX
33 #include "TransformerBase.hxx"
34 #endif
35 #include "MutableAttrList.hxx"
36 #include <xmloff/nmspmap.hxx>
37 #include "PersAttrListTContext.hxx"
38 
39 using ::rtl::OUString;
40 
41 using namespace ::com::sun::star::uno;
42 using namespace ::com::sun::star::util;
43 using namespace ::com::sun::star::xml::sax;
44 
45 TYPEINIT1( XMLPersAttrListTContext, XMLTransformerContext );
46 
47 void XMLPersAttrListTContext::AddAttribute(
48 		sal_uInt16 nAPrefix,
49 	   	::xmloff::token::XMLTokenEnum eAToken,
50 	   	::xmloff::token::XMLTokenEnum eVToken )
51 {
52 	OUString aAttrValue( ::xmloff::token::GetXMLToken( eVToken ) );
53     AddAttribute( nAPrefix, eAToken, aAttrValue );
54 }
55 
56 void XMLPersAttrListTContext::AddAttribute(
57     sal_uInt16 nAPrefix,
58     ::xmloff::token::XMLTokenEnum eAToken,
59     const ::rtl::OUString & rValue )
60 {
61 	OUString aAttrQName( GetTransformer().GetNamespaceMap().GetQNameByKey(
62 				nAPrefix, ::xmloff::token::GetXMLToken( eAToken ) ) );
63 	OUString aAttrValue( rValue );
64 
65 	XMLMutableAttributeList *pMutableAttrList;
66 	if( m_xAttrList.is() )
67 	{
68 		pMutableAttrList =
69 			static_cast< XMLMutableAttributeList * >( m_xAttrList.get() );
70 	}
71 	else
72 	{
73 		pMutableAttrList = new XMLMutableAttributeList ;
74 		m_xAttrList = pMutableAttrList;
75 	}
76 
77 	pMutableAttrList->AddAttribute( aAttrQName, aAttrValue );
78 }
79 
80 XMLPersAttrListTContext::XMLPersAttrListTContext(
81 		XMLTransformerBase& rImp,
82 		const OUString& rQName ) :
83 	XMLTransformerContext( rImp, rQName ),
84 	m_aElemQName( rQName ),
85 	m_nActionMap( INVALID_ACTIONS )
86 {
87 }
88 
89 XMLPersAttrListTContext::XMLPersAttrListTContext(
90 		XMLTransformerBase& rImp,
91 		const OUString& rQName,
92 	   sal_uInt16 nActionMap ) :
93 	XMLTransformerContext( rImp, rQName ),
94 	m_aElemQName( rQName ),
95 	m_nActionMap( nActionMap )
96 {
97 }
98 
99 XMLPersAttrListTContext::XMLPersAttrListTContext(
100 		XMLTransformerBase& rImp,
101 		const OUString& rQName,
102 	    sal_uInt16 nPrefix,
103 		::xmloff::token::XMLTokenEnum eToken ) :
104 	XMLTransformerContext( rImp, rQName ),
105 	m_aElemQName( rImp.GetNamespaceMap().GetQNameByKey( nPrefix,
106 							::xmloff::token::GetXMLToken( eToken ) ) ),
107 	m_nActionMap( INVALID_ACTIONS )
108 {
109 }
110 
111 XMLPersAttrListTContext::XMLPersAttrListTContext(
112 		XMLTransformerBase& rImp,
113 		const OUString& rQName,
114 	    sal_uInt16 nPrefix,
115 		::xmloff::token::XMLTokenEnum eToken,
116 	   sal_uInt16 nActionMap ) :
117 	XMLTransformerContext( rImp, rQName ),
118 	m_aElemQName( rImp.GetNamespaceMap().GetQNameByKey( nPrefix,
119 							::xmloff::token::GetXMLToken( eToken ) ) ),
120 	m_nActionMap( nActionMap )
121 {
122 }
123 
124 XMLPersAttrListTContext::~XMLPersAttrListTContext()
125 {
126 }
127 
128 XMLTransformerContext *XMLPersAttrListTContext::CreateChildContext(
129 		sal_uInt16 /*nPrefix*/,
130 		const OUString& /*rLocalName*/,
131 		const OUString& rQName,
132 		const Reference< XAttributeList >& )
133 {
134 	// ignore all child elements
135 	return  new XMLIgnoreTransformerContext( GetTransformer(),
136 											 rQName, sal_True, sal_True );
137 }
138 
139 void XMLPersAttrListTContext::StartElement(
140 	const Reference< XAttributeList >& rAttrList )
141 {
142 	XMLMutableAttributeList *pMutableAttrList = 0;
143 
144 	Reference< XAttributeList > xAttrList( rAttrList );
145 	if( m_nActionMap != INVALID_ACTIONS )
146 	{
147 		pMutableAttrList =
148 			GetTransformer().ProcessAttrList( xAttrList, m_nActionMap,
149 				   							  sal_True );
150 	}
151 
152 	if( m_xAttrList.is() )
153 	{
154 		static_cast< XMLMutableAttributeList * >( m_xAttrList.get() )
155 				->AppendAttributeList( xAttrList );
156 	}
157 	else if( pMutableAttrList )
158 	{
159 		m_xAttrList = xAttrList;
160 	}
161 	else
162 	{
163 		m_xAttrList = new XMLMutableAttributeList( rAttrList, sal_True );
164 	}
165 }
166 
167 void XMLPersAttrListTContext::EndElement()
168 {
169 	// ignore for now
170 }
171 
172 void XMLPersAttrListTContext::Characters( const OUString& )
173 {
174 }
175 
176 sal_Bool XMLPersAttrListTContext::IsPersistent() const
177 {
178 	return sal_True;
179 }
180 
181 void XMLPersAttrListTContext::Export()
182 {
183 	GetTransformer().GetDocHandler()->startElement( m_aElemQName, m_xAttrList );
184 	ExportContent();
185 	GetTransformer().GetDocHandler()->endElement( m_aElemQName );
186 }
187 
188 void XMLPersAttrListTContext::ExportContent()
189 {
190 	// nothing to export
191 }
192 
193 Reference< XAttributeList > XMLPersAttrListTContext::GetAttrList() const
194 {
195     return m_xAttrList;
196 }
197