xref: /AOO41X/main/dbaccess/source/filter/xml/xmlDataSourceSetting.cxx (revision 96de54900b79e13b861fbc62cbf36018b54e21b7)
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_dbaccess.hxx"
26 #ifndef DBA_XMLDATASOURCESETTING_HXX
27 #include "xmlDataSourceSetting.hxx"
28 #endif
29 #ifndef DBA_XMLDATASOURCE_HXX
30 #include "xmlDataSource.hxx"
31 #endif
32 #ifndef _XMLOFF_XMLUCONV_HXX
33 #include <xmloff/xmluconv.hxx>
34 #endif
35 #ifndef DBA_XMLFILTER_HXX
36 #include "xmlfilter.hxx"
37 #endif
38 #ifndef _XMLOFF_XMLTOKEN_HXX
39 #include <xmloff/xmltoken.hxx>
40 #endif
41 #ifndef _XMLOFF_XMLNMSPE_HXX
42 #include <xmloff/xmlnmspe.hxx>
43 #endif
44 #ifndef _XMLOFF_NMSPMAP_HXX
45 #include <xmloff/nmspmap.hxx>
46 #endif
47 #ifndef DBA_XMLENUMS_HXX
48 #include "xmlEnums.hxx"
49 #endif
50 #ifndef DBACCESS_SHARED_XMLSTRINGS_HRC
51 #include "xmlstrings.hrc"
52 #endif
53 #ifndef _TOOLS_DEBUG_HXX
54 #include <tools/debug.hxx>
55 #endif
56 
57 namespace dbaxml
58 {
59     using namespace ::com::sun::star::uno;
60     using namespace ::com::sun::star::xml::sax;
DBG_NAME(OXMLDataSourceSetting)61 DBG_NAME(OXMLDataSourceSetting)
62 
63 OXMLDataSourceSetting::OXMLDataSourceSetting( ODBFilter& rImport
64                 ,sal_uInt16 nPrfx
65                 ,const ::rtl::OUString& _sLocalName
66                 ,const Reference< XAttributeList > & _xAttrList
67                 ,OXMLDataSourceSetting* _pContainer) :
68     SvXMLImportContext( rImport, nPrfx, _sLocalName )
69     ,m_pContainer(_pContainer)
70     ,m_bIsList(sal_False)
71 {
72     DBG_CTOR(OXMLDataSourceSetting,NULL);
73 
74     m_aPropType = ::getVoidCppuType();
75 
76     OSL_ENSURE(_xAttrList.is(),"Attribute list is NULL!");
77     const SvXMLNamespaceMap& rMap = rImport.GetNamespaceMap();
78     const SvXMLTokenMap& rTokenMap = rImport.GetDataSourceInfoElemTokenMap();
79 
80     sal_Int16 nLength = (_xAttrList.is()) ? _xAttrList->getLength() : 0;
81     for(sal_Int16 i = 0; i < nLength; ++i)
82     {
83         ::rtl::OUString sLocalName;
84         rtl::OUString sAttrName = _xAttrList->getNameByIndex( i );
85         sal_uInt16 nPrefix = rMap.GetKeyByAttrName( sAttrName,&sLocalName );
86         rtl::OUString sValue = _xAttrList->getValueByIndex( i );
87 
88         switch( rTokenMap.Get( nPrefix, sLocalName ) )
89         {
90             case XML_TOK_DATA_SOURCE_SETTING_IS_LIST:
91                 m_bIsList = sValue.equalsAscii("true");
92                 break;
93             case XML_TOK_DATA_SOURCE_SETTING_TYPE:
94                 {
95                     // needs to be translated into a ::com::sun::star::uno::Type
96                     DECLARE_STL_USTRINGACCESS_MAP( ::com::sun::star::uno::Type, MapString2Type );
97                     static MapString2Type s_aTypeNameMap;
98                     if (!s_aTypeNameMap.size())
99                     {
100                         s_aTypeNameMap[GetXMLToken( XML_BOOLEAN)]   = ::getBooleanCppuType();
101                         s_aTypeNameMap[GetXMLToken( XML_FLOAT)]     = ::getCppuType( static_cast< double* >(NULL) );
102                         s_aTypeNameMap[GetXMLToken( XML_DOUBLE)]    = ::getCppuType( static_cast< double* >(NULL) );
103                         s_aTypeNameMap[GetXMLToken( XML_STRING)]    = ::getCppuType( static_cast< ::rtl::OUString* >(NULL) );
104                         s_aTypeNameMap[GetXMLToken( XML_INT)]       = ::getCppuType( static_cast< sal_Int32* >(NULL) );
105                         s_aTypeNameMap[GetXMLToken( XML_SHORT)]     = ::getCppuType( static_cast< sal_Int16* >(NULL) );
106                         s_aTypeNameMap[GetXMLToken( XML_VOID)]      = ::getVoidCppuType();
107                     }
108 
109                     const ConstMapString2TypeIterator aTypePos = s_aTypeNameMap.find(sValue);
110                     OSL_ENSURE(s_aTypeNameMap.end() != aTypePos, "OXMLDataSourceSetting::OXMLDataSourceSetting: invalid type!");
111                     if (s_aTypeNameMap.end() != aTypePos)
112                         m_aPropType = aTypePos->second;
113                 }
114                 break;
115             case XML_TOK_DATA_SOURCE_SETTING_NAME:
116                 m_aSetting.Name = sValue;
117                 break;
118         }
119     }
120 
121 }
122 // -----------------------------------------------------------------------------
123 
~OXMLDataSourceSetting()124 OXMLDataSourceSetting::~OXMLDataSourceSetting()
125 {
126     DBG_DTOR(OXMLDataSourceSetting,NULL);
127 }
128 // -----------------------------------------------------------------------------
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const Reference<XAttributeList> & xAttrList)129 SvXMLImportContext* OXMLDataSourceSetting::CreateChildContext(
130         sal_uInt16 nPrefix,
131         const ::rtl::OUString& rLocalName,
132         const Reference< XAttributeList > & xAttrList )
133 {
134     SvXMLImportContext *pContext = 0;
135     const SvXMLTokenMap&    rTokenMap   = GetOwnImport().GetDataSourceInfoElemTokenMap();
136 
137     switch( rTokenMap.Get( nPrefix, rLocalName ) )
138     {
139         case XML_TOK_DATA_SOURCE_SETTING:
140             GetOwnImport().GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
141             pContext = new OXMLDataSourceSetting( GetOwnImport(), nPrefix, rLocalName,xAttrList);
142             break;
143         case XML_TOK_DATA_SOURCE_SETTING_VALUE:
144             GetOwnImport().GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
145             pContext = new OXMLDataSourceSetting( GetOwnImport(), nPrefix, rLocalName,xAttrList,this );
146             break;
147     }
148 
149     if( !pContext )
150         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
151 
152     return pContext;
153 }
154 // -----------------------------------------------------------------------------
EndElement()155 void OXMLDataSourceSetting::EndElement()
156 {
157     if ( m_aSetting.Name.getLength() )
158     {
159         if ( m_bIsList && m_aInfoSequence.getLength() )
160             m_aSetting.Value <<= m_aInfoSequence;
161 
162         // if our property is of type string, but was empty, ensure that
163         // we don't add a VOID value
164         if ( !m_bIsList && ( m_aPropType.getTypeClass() == TypeClass_STRING ) && !m_aSetting.Value.hasValue() )
165             m_aSetting.Value <<= ::rtl::OUString();
166 
167         GetOwnImport().addInfo(m_aSetting);
168     }
169 }
170 // -----------------------------------------------------------------------------
Characters(const::rtl::OUString & rChars)171 void OXMLDataSourceSetting::Characters( const ::rtl::OUString& rChars )
172 {
173     if ( m_pContainer )
174         m_pContainer->addValue(rChars);
175 }
176 // -----------------------------------------------------------------------------
addValue(const::rtl::OUString & _sValue)177 void OXMLDataSourceSetting::addValue(const ::rtl::OUString& _sValue)
178 {
179     Any aValue;
180     if( TypeClass_VOID != m_aPropType.getTypeClass() )
181         aValue = convertString(m_aPropType, _sValue);
182 
183     if ( !m_bIsList )
184         m_aSetting.Value = aValue;
185     else
186     {
187         sal_Int32 nPos = m_aInfoSequence.getLength();
188         m_aInfoSequence.realloc(nPos+1);
189         m_aInfoSequence[nPos] = aValue;
190     }
191 }
192 // -----------------------------------------------------------------------------
GetOwnImport()193 ODBFilter& OXMLDataSourceSetting::GetOwnImport()
194 {
195     return static_cast<ODBFilter&>(GetImport());
196 }
197 // -----------------------------------------------------------------------------
convertString(const::com::sun::star::uno::Type & _rExpectedType,const::rtl::OUString & _rReadCharacters)198 Any OXMLDataSourceSetting::convertString(const ::com::sun::star::uno::Type& _rExpectedType, const ::rtl::OUString& _rReadCharacters)
199 {
200     ODBFilter& rImporter = GetOwnImport();
201     Any aReturn;
202     switch (_rExpectedType.getTypeClass())
203     {
204         case TypeClass_BOOLEAN:     // sal_Bool
205         {
206             sal_Bool bValue;
207         #if OSL_DEBUG_LEVEL > 0
208             sal_Bool bSuccess =
209         #endif
210             rImporter.GetMM100UnitConverter().convertBool(bValue, _rReadCharacters);
211             OSL_ENSURE(bSuccess,
212                     ::rtl::OString("OXMLDataSourceSetting::convertString: could not convert \"")
213                 +=  ::rtl::OString(_rReadCharacters.getStr(), _rReadCharacters.getLength(), RTL_TEXTENCODING_ASCII_US)
214                 +=  ::rtl::OString("\" into a boolean!"));
215             aReturn <<= bValue;
216         }
217         break;
218         case TypeClass_SHORT:       // sal_Int16
219         case TypeClass_LONG:        // sal_Int32
220             {   // it's a real int32/16 property
221                 sal_Int32 nValue(0);
222         #if OSL_DEBUG_LEVEL > 0
223                 sal_Bool bSuccess =
224         #endif
225                 rImporter.GetMM100UnitConverter().convertNumber(nValue, _rReadCharacters);
226                 OSL_ENSURE(bSuccess,
227                         ::rtl::OString("OXMLDataSourceSetting::convertString: could not convert \"")
228                     +=  ::rtl::OString(_rReadCharacters.getStr(), _rReadCharacters.getLength(), RTL_TEXTENCODING_ASCII_US)
229                     +=  ::rtl::OString("\" into an integer!"));
230                 if (TypeClass_SHORT == _rExpectedType.getTypeClass())
231                     aReturn <<= (sal_Int16)nValue;
232                 else
233                     aReturn <<= (sal_Int32)nValue;
234                 break;
235             }
236         case TypeClass_HYPER:
237         {
238             OSL_ENSURE(sal_False, "OXMLDataSourceSetting::convertString: 64-bit integers not implemented yet!");
239         }
240         break;
241         case TypeClass_DOUBLE:
242         {
243             double nValue = 0.0;
244         #if OSL_DEBUG_LEVEL > 0
245             sal_Bool bSuccess =
246         #endif
247             rImporter.GetMM100UnitConverter().convertDouble(nValue, _rReadCharacters);
248             OSL_ENSURE(bSuccess,
249                     ::rtl::OString("OXMLDataSourceSetting::convertString: could not convert \"")
250                 +=  ::rtl::OString(_rReadCharacters.getStr(), _rReadCharacters.getLength(), RTL_TEXTENCODING_ASCII_US)
251                 +=  ::rtl::OString("\" into a double!"));
252             aReturn <<= (double)nValue;
253         }
254         break;
255         case TypeClass_STRING:
256             aReturn <<= _rReadCharacters;
257             break;
258         default:
259             OSL_ENSURE(sal_False, "OXMLDataSourceSetting::convertString: invalid type class!");
260     }
261 
262     return aReturn;
263 }
264 
265 //----------------------------------------------------------------------------
266 } // namespace dbaxml
267 // -----------------------------------------------------------------------------
268