xref: /AOO41X/main/xmloff/source/style/xmlprmap.cxx (revision 63bba73cc51e0afb45f8a8d578158724bb5afee8)
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 
XMLPropertySetMapperEntry_Impl(const XMLPropertyMapEntry & rMapEntry,const UniReference<XMLPropertyHandlerFactory> & rFactory)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 
XMLPropertySetMapperEntry_Impl(const XMLPropertySetMapperEntry_Impl & rEntry)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 //
XMLPropertySetMapper(const XMLPropertyMapEntry * pEntries,const UniReference<XMLPropertyHandlerFactory> & rFactory)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 
~XMLPropertySetMapper()95 XMLPropertySetMapper::~XMLPropertySetMapper()
96 {
97 }
98 
AddMapperEntry(const UniReference<XMLPropertySetMapper> & rMapper)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 //
exportXML(OUString & rStrExpValue,const XMLPropertyState & rProperty,const SvXMLUnitConverter & rUnitConverter) const123 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 //
importXML(const OUString & rStrImpValue,XMLPropertyState & rProperty,const SvXMLUnitConverter & rUnitConverter) const144 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 //
GetEntryIndex(sal_uInt16 nNamespace,const OUString & rStrName,sal_uInt32 nPropType,sal_Int32 nStartAt) const166 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 */
FindEntryIndex(const sal_Char * sApiName,sal_uInt16 nNameSpace,const OUString & sXMLName) const195 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 
FindEntryIndex(const sal_Int16 nContextId) const218 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 
RemoveEntry(sal_Int32 nIndex)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