xref: /aoo42x/main/xmloff/source/style/xmlprmap.cxx (revision 63bba73c)
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_xmloff.hxx"
26 #include <tools/debug.hxx>
27 #include <xmloff/xmlprhdl.hxx>
28 #include "xmlbahdl.hxx"
29 #include <xmloff/xmlprmap.hxx>
30 #include <xmloff/xmltypes.hxx>
31 #include <com/sun/star/beans/XPropertySet.hpp>
32 #include <com/sun/star/beans/XPropertyState.hpp>
33 #include <com/sun/star/uno/Any.hxx>
34 #include <xmloff/xmltoken.hxx>
35 
36 
37 using namespace ::std;
38 using ::rtl::OUString;
39 using ::rtl::OUStringBuffer;
40 
41 using namespace ::com::sun::star::uno;
42 using namespace ::com::sun::star::beans;
43 using ::xmloff::token::GetXMLToken;
44 
45 XMLPropertySetMapperEntry_Impl::XMLPropertySetMapperEntry_Impl(
46 	const XMLPropertyMapEntry& rMapEntry,
47 	const UniReference< XMLPropertyHandlerFactory >& rFactory ) :
48 	sXMLAttributeName( GetXMLToken(rMapEntry.meXMLName) ),
49 	sAPIPropertyName( OUString(rMapEntry.msApiName, rMapEntry.nApiNameLength,
50                                RTL_TEXTENCODING_ASCII_US ) ),
51 	nXMLNameSpace( rMapEntry.mnNameSpace ),
52 	nType( rMapEntry.mnType ),
53 	nContextId( rMapEntry.mnContextId ),
54     nEarliestODFVersionForExport( rMapEntry.mnEarliestODFVersionForExport ),
55 	pHdl( rFactory->GetPropertyHandler( rMapEntry.mnType & MID_FLAG_MASK ) )
56 {
57 }
58 
59 XMLPropertySetMapperEntry_Impl::XMLPropertySetMapperEntry_Impl(
60 		const XMLPropertySetMapperEntry_Impl& rEntry ) :
61 	sXMLAttributeName( rEntry.sXMLAttributeName),
62 	sAPIPropertyName( rEntry.sAPIPropertyName),
63 	nXMLNameSpace( rEntry.nXMLNameSpace),
64 	nType( rEntry.nType),
65 	nContextId( rEntry.nContextId),
66     nEarliestODFVersionForExport( rEntry.nEarliestODFVersionForExport ),
67 	pHdl( rEntry.pHdl)
68 {
69 	DBG_ASSERT( pHdl, "Unknown XML property type handler!" );
70 }
71 
72 ///////////////////////////////////////////////////////////////////////////
73 //
74 // Ctor
75 //
76 XMLPropertySetMapper::XMLPropertySetMapper(
77 		const XMLPropertyMapEntry* pEntries,
78 		const UniReference< XMLPropertyHandlerFactory >& rFactory )
79 {
80 	aHdlFactories.push_back( rFactory );
81 	if( pEntries )
82 	{
83 		const XMLPropertyMapEntry* pIter = pEntries;
84 
85 		// count entries
86 		while( pIter->msApiName )
87 		{
88 			XMLPropertySetMapperEntry_Impl aEntry( *pIter, rFactory );
89 			aMapEntries.push_back( aEntry );
90 			pIter++;
91 		}
92 	}
93 }
94 
95 XMLPropertySetMapper::~XMLPropertySetMapper()
96 {
97 }
98 
99 void XMLPropertySetMapper::AddMapperEntry(
100 	const UniReference < XMLPropertySetMapper >& rMapper )
101 {
102 	for( vector < UniReference < XMLPropertyHandlerFactory > >::iterator
103 			aFIter = rMapper->aHdlFactories.begin();
104 		 aFIter != rMapper->aHdlFactories.end();
105 		 aFIter++ )
106 	{
107 		aHdlFactories.push_back( *aFIter );
108 	}
109 
110 	for( vector < XMLPropertySetMapperEntry_Impl >::iterator
111 			aEIter = rMapper->aMapEntries.begin();
112 		 aEIter != rMapper->aMapEntries.end();
113 		 aEIter++ )
114 	{
115 		aMapEntries.push_back( *aEIter );
116 	}
117 }
118 
119 ///////////////////////////////////////////////////////////////////////////
120 //
121 // Export a Property
122 //
123 sal_Bool XMLPropertySetMapper::exportXML(
124 		OUString& rStrExpValue,
125 		const XMLPropertyState& rProperty,
126 		const SvXMLUnitConverter& rUnitConverter ) const
127 {
128 	sal_Bool bRet = sal_False;
129 
130 	const XMLPropertyHandler* pHdl = GetPropertyHandler( rProperty.mnIndex );
131 
132 	DBG_ASSERT( pHdl, "Unknown XML Type!" );
133 	if( pHdl )
134 		bRet = pHdl->exportXML( rStrExpValue, rProperty.maValue,
135 								rUnitConverter );
136 
137 	return bRet;
138 }
139 
140 ///////////////////////////////////////////////////////////////////////////
141 //
142 // Import a Property
143 //
144 sal_Bool XMLPropertySetMapper::importXML(
145 		const OUString& rStrImpValue,
146 		XMLPropertyState& rProperty,
147 		const SvXMLUnitConverter& rUnitConverter ) const
148 {
149 	sal_Bool bRet = sal_False;
150 
151 	const XMLPropertyHandler* pHdl = GetPropertyHandler( rProperty.mnIndex );
152 
153 	if( pHdl )
154 		bRet = pHdl->importXML( rStrImpValue, rProperty.maValue,
155 								rUnitConverter );
156 
157 	return bRet;
158 }
159 
160 ///////////////////////////////////////////////////////////////////////////
161 //
162 // Search for the given name and the namespace in the list and return
163 // the index of the entry
164 // If there is no matching entry the method returns -1
165 //
166 sal_Int32 XMLPropertySetMapper::GetEntryIndex(
167 		sal_uInt16 nNamespace,
168 		const OUString& rStrName,
169 		sal_uInt32 nPropType,
170 		sal_Int32 nStartAt /* = -1 */ ) const
171 {
172 	sal_Int32 nEntries = GetEntryCount();
173 	sal_Int32 nIndex= nStartAt == - 1? 0 : nStartAt+1;
174 
175     if ( nEntries )
176     {
177 	    do
178 	    {
179 		    const XMLPropertySetMapperEntry_Impl& rEntry = aMapEntries[nIndex];
180 		    if( (!nPropType || nPropType == rEntry.GetPropType()) &&
181 			    rEntry.nXMLNameSpace == nNamespace &&
182 			    rStrName == rEntry.sXMLAttributeName )
183 			    return nIndex;
184 		    else
185 			    nIndex++;
186 
187 	    } while( nIndex<nEntries );
188     }
189 
190 	return -1;
191 }
192 
193 
194 /** searches for an entry that matches the given api name, namespace and local name or -1 if nothing found */
195 sal_Int32 XMLPropertySetMapper::FindEntryIndex(
196 		const sal_Char* sApiName,
197 		sal_uInt16 nNameSpace,
198 		const OUString& sXMLName ) const
199 {
200 	sal_Int32 nIndex = 0;
201 	sal_Int32 nEntries = GetEntryCount();
202 
203 	do
204 	{
205 		const XMLPropertySetMapperEntry_Impl& rEntry = aMapEntries[nIndex];
206 		if( rEntry.nXMLNameSpace == nNameSpace &&
207 			rEntry.sXMLAttributeName.equals( sXMLName ) &&
208 			0 == rEntry.sAPIPropertyName.compareToAscii( sApiName ) )
209 			return nIndex;
210 		else
211 			nIndex++;
212 
213 	} while( nIndex < nEntries );
214 
215 	return -1;
216 }
217 
218 sal_Int32 XMLPropertySetMapper::FindEntryIndex( const sal_Int16 nContextId ) const
219 {
220 	sal_Int32 nIndex = 0;
221 	const sal_Int32 nEntries = GetEntryCount();
222 
223     if ( nEntries )
224     {
225 	    do
226 	    {
227 		    const XMLPropertySetMapperEntry_Impl& rEntry = aMapEntries[nIndex];
228 		    if( rEntry.nContextId == nContextId )
229 			    return nIndex;
230 		    else
231 			    nIndex++;
232 
233 	    } while( nIndex < nEntries );
234     }
235 
236 	return -1;
237 }
238 
239 void XMLPropertySetMapper::RemoveEntry( sal_Int32 nIndex )
240 {
241     const sal_Int32 nEntries = GetEntryCount();
242     if( nIndex>=nEntries || nIndex<0 )
243         return;
244     vector < XMLPropertySetMapperEntry_Impl >::iterator aEIter = aMapEntries.begin();
245     for( sal_Int32 nN=0; nN<nIndex; nN++ )
246         aEIter++;
247     aMapEntries.erase( aEIter );
248 }
249