1*3b8558fdSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*3b8558fdSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*3b8558fdSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*3b8558fdSAndrew Rist * distributed with this work for additional information 6*3b8558fdSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*3b8558fdSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*3b8558fdSAndrew Rist * "License"); you may not use this file except in compliance 9*3b8558fdSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*3b8558fdSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*3b8558fdSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*3b8558fdSAndrew Rist * software distributed under the License is distributed on an 15*3b8558fdSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*3b8558fdSAndrew Rist * KIND, either express or implied. See the License for the 17*3b8558fdSAndrew Rist * specific language governing permissions and limitations 18*3b8558fdSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*3b8558fdSAndrew Rist *************************************************************/ 21*3b8558fdSAndrew Rist 22*3b8558fdSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_linguistic.hxx" 26cdf0e10cSrcweir #include <tools/urlobj.hxx> 27cdf0e10cSrcweir #include <tools/debug.hxx> 28cdf0e10cSrcweir #include <tools/fsys.hxx> 29cdf0e10cSrcweir #include <tools/string.hxx> 30cdf0e10cSrcweir #include <i18npool/mslangid.hxx> 31cdf0e10cSrcweir #include <tools/stream.hxx> 32cdf0e10cSrcweir #include <osl/mutex.hxx> 33cdf0e10cSrcweir #include <unotools/processfactory.hxx> 34cdf0e10cSrcweir #include <ucbhelper/content.hxx> 35cdf0e10cSrcweir 36cdf0e10cSrcweir #include <cppuhelper/factory.hxx> // helper for factories 37cdf0e10cSrcweir #include <com/sun/star/linguistic2/XConversionDictionary.hpp> 38cdf0e10cSrcweir #include <com/sun/star/linguistic2/ConversionDictionaryType.hpp> 39cdf0e10cSrcweir #include <com/sun/star/linguistic2/ConversionPropertyType.hpp> 40cdf0e10cSrcweir #include <com/sun/star/util/XFlushable.hpp> 41cdf0e10cSrcweir #include <com/sun/star/lang/Locale.hpp> 42cdf0e10cSrcweir #include <com/sun/star/lang/EventObject.hpp> 43cdf0e10cSrcweir #ifndef _COM_SUN_STAR_UNO_REFERENCE_HPP_ 44cdf0e10cSrcweir #include <com/sun/star/uno/Reference.h> 45cdf0e10cSrcweir #endif 46cdf0e10cSrcweir #include <com/sun/star/registry/XRegistryKey.hpp> 47cdf0e10cSrcweir #include <com/sun/star/util/XFlushListener.hpp> 48cdf0e10cSrcweir #include <com/sun/star/io/XActiveDataSource.hpp> 49cdf0e10cSrcweir #include <com/sun/star/document/XFilter.hpp> 50cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp> 51cdf0e10cSrcweir #include <xmloff/nmspmap.hxx> 52cdf0e10cSrcweir #include <xmloff/xmlnmspe.hxx> 53cdf0e10cSrcweir #include <unotools/streamwrap.hxx> 54cdf0e10cSrcweir 55cdf0e10cSrcweir #include "convdic.hxx" 56cdf0e10cSrcweir #include "convdicxml.hxx" 57cdf0e10cSrcweir #include "linguistic/misc.hxx" 58cdf0e10cSrcweir #include "defs.hxx" 59cdf0e10cSrcweir 60cdf0e10cSrcweir using namespace std; 61cdf0e10cSrcweir using namespace utl; 62cdf0e10cSrcweir using namespace osl; 63cdf0e10cSrcweir using namespace rtl; 64cdf0e10cSrcweir using namespace com::sun::star; 65cdf0e10cSrcweir using namespace com::sun::star::lang; 66cdf0e10cSrcweir using namespace com::sun::star::uno; 67cdf0e10cSrcweir using namespace com::sun::star::linguistic2; 68cdf0e10cSrcweir using namespace linguistic; 69cdf0e10cSrcweir 70cdf0e10cSrcweir #define XML_NAMESPACE_TCD_STRING "http://openoffice.org/2003/text-conversion-dictionary" 71cdf0e10cSrcweir #define CONV_TYPE_HANGUL_HANJA "Hangul / Hanja" 72cdf0e10cSrcweir #define CONV_TYPE_SCHINESE_TCHINESE "Chinese simplified / Chinese traditional" 73cdf0e10cSrcweir 74cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////// 75cdf0e10cSrcweir 76cdf0e10cSrcweir static const OUString ConversionTypeToText( sal_Int16 nConversionType ) 77cdf0e10cSrcweir { 78cdf0e10cSrcweir OUString aRes; 79cdf0e10cSrcweir if (nConversionType == ConversionDictionaryType::HANGUL_HANJA) 80cdf0e10cSrcweir aRes = A2OU( CONV_TYPE_HANGUL_HANJA ); 81cdf0e10cSrcweir else if (nConversionType == ConversionDictionaryType::SCHINESE_TCHINESE) 82cdf0e10cSrcweir aRes = A2OU( CONV_TYPE_SCHINESE_TCHINESE ); 83cdf0e10cSrcweir return aRes; 84cdf0e10cSrcweir } 85cdf0e10cSrcweir 86cdf0e10cSrcweir static sal_Int16 GetConversionTypeFromText( const String &rText ) 87cdf0e10cSrcweir { 88cdf0e10cSrcweir sal_Int16 nRes = -1; 89cdf0e10cSrcweir if (rText.EqualsAscii( CONV_TYPE_HANGUL_HANJA )) 90cdf0e10cSrcweir nRes = ConversionDictionaryType::HANGUL_HANJA; 91cdf0e10cSrcweir else if (rText.EqualsAscii( CONV_TYPE_SCHINESE_TCHINESE )) 92cdf0e10cSrcweir nRes = ConversionDictionaryType::SCHINESE_TCHINESE; 93cdf0e10cSrcweir return nRes; 94cdf0e10cSrcweir } 95cdf0e10cSrcweir 96cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////// 97cdf0e10cSrcweir 98cdf0e10cSrcweir class ConvDicXMLImportContext : 99cdf0e10cSrcweir public SvXMLImportContext 100cdf0e10cSrcweir { 101cdf0e10cSrcweir public: 102cdf0e10cSrcweir ConvDicXMLImportContext( 103cdf0e10cSrcweir ConvDicXMLImport &rImport, 104cdf0e10cSrcweir sal_uInt16 nPrfx, const OUString& rLName ) : 105cdf0e10cSrcweir SvXMLImportContext( rImport, nPrfx, rLName ) 106cdf0e10cSrcweir { 107cdf0e10cSrcweir } 108cdf0e10cSrcweir 109cdf0e10cSrcweir const ConvDicXMLImport & GetConvDicImport() const 110cdf0e10cSrcweir { 111cdf0e10cSrcweir return (const ConvDicXMLImport &) GetImport(); 112cdf0e10cSrcweir } 113cdf0e10cSrcweir 114cdf0e10cSrcweir ConvDicXMLImport & GetConvDicImport() 115cdf0e10cSrcweir { 116cdf0e10cSrcweir return (ConvDicXMLImport &) GetImport(); 117cdf0e10cSrcweir } 118cdf0e10cSrcweir 119cdf0e10cSrcweir // SvXMLImportContext 120cdf0e10cSrcweir virtual void Characters( const OUString &rChars ); 121cdf0e10cSrcweir virtual SvXMLImportContext * CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const uno::Reference< xml::sax::XAttributeList > &rxAttrList); 122cdf0e10cSrcweir }; 123cdf0e10cSrcweir 124cdf0e10cSrcweir 125cdf0e10cSrcweir class ConvDicXMLDictionaryContext_Impl : 126cdf0e10cSrcweir public ConvDicXMLImportContext 127cdf0e10cSrcweir { 128cdf0e10cSrcweir sal_Int16 nLanguage; 129cdf0e10cSrcweir sal_Int16 nConversionType; 130cdf0e10cSrcweir 131cdf0e10cSrcweir public: 132cdf0e10cSrcweir ConvDicXMLDictionaryContext_Impl( ConvDicXMLImport &rImport, 133cdf0e10cSrcweir sal_uInt16 nPrefix, const OUString& rLName) : 134cdf0e10cSrcweir ConvDicXMLImportContext( rImport, nPrefix, rLName ) 135cdf0e10cSrcweir { 136cdf0e10cSrcweir nLanguage = LANGUAGE_NONE; 137cdf0e10cSrcweir nConversionType = -1; 138cdf0e10cSrcweir } 139cdf0e10cSrcweir 140cdf0e10cSrcweir // SvXMLImportContext 141cdf0e10cSrcweir virtual void StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ); 142cdf0e10cSrcweir virtual SvXMLImportContext * CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const uno::Reference< xml::sax::XAttributeList > &rxAttrList ); 143cdf0e10cSrcweir 144cdf0e10cSrcweir sal_Int16 GetLanguage() const { return nLanguage; } 145cdf0e10cSrcweir sal_Int16 GetConversionType() const { return nConversionType; } 146cdf0e10cSrcweir }; 147cdf0e10cSrcweir 148cdf0e10cSrcweir 149cdf0e10cSrcweir class ConvDicXMLEntryTextContext_Impl : 150cdf0e10cSrcweir public ConvDicXMLImportContext 151cdf0e10cSrcweir { 152cdf0e10cSrcweir OUString aLeftText; 153cdf0e10cSrcweir sal_Int16 nPropertyType; // used for Chinese simplified/traditional conversion 154cdf0e10cSrcweir ConvDicXMLDictionaryContext_Impl &rDicContext; 155cdf0e10cSrcweir 156cdf0e10cSrcweir public: 157cdf0e10cSrcweir ConvDicXMLEntryTextContext_Impl( 158cdf0e10cSrcweir ConvDicXMLImport &rImport, 159cdf0e10cSrcweir sal_uInt16 nPrefix, const OUString& rLName, 160cdf0e10cSrcweir ConvDicXMLDictionaryContext_Impl &rParentContext ) : 161cdf0e10cSrcweir ConvDicXMLImportContext( rImport, nPrefix, rLName ), 162cdf0e10cSrcweir nPropertyType( ConversionPropertyType::NOT_DEFINED ), 163cdf0e10cSrcweir rDicContext( rParentContext ) 164cdf0e10cSrcweir { 165cdf0e10cSrcweir } 166cdf0e10cSrcweir 167cdf0e10cSrcweir // SvXMLImportContext 168cdf0e10cSrcweir virtual void StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ); 169cdf0e10cSrcweir virtual SvXMLImportContext * CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const uno::Reference< xml::sax::XAttributeList > &rxAttrList ); 170cdf0e10cSrcweir 171cdf0e10cSrcweir const OUString & GetLeftText() const { return aLeftText; } 172cdf0e10cSrcweir sal_Int16 GetPropertyType() const { return nPropertyType; } 173cdf0e10cSrcweir void SetPropertyType( sal_Int16 nVal ) { nPropertyType = nVal; } 174cdf0e10cSrcweir }; 175cdf0e10cSrcweir 176cdf0e10cSrcweir 177cdf0e10cSrcweir class ConvDicXMLRightTextContext_Impl : 178cdf0e10cSrcweir public ConvDicXMLImportContext 179cdf0e10cSrcweir { 180cdf0e10cSrcweir OUString aRightText; 181cdf0e10cSrcweir ConvDicXMLEntryTextContext_Impl &rEntryContext; 182cdf0e10cSrcweir 183cdf0e10cSrcweir public: 184cdf0e10cSrcweir ConvDicXMLRightTextContext_Impl( 185cdf0e10cSrcweir ConvDicXMLImport &rImport, 186cdf0e10cSrcweir sal_uInt16 nPrefix, const OUString& rLName, 187cdf0e10cSrcweir ConvDicXMLEntryTextContext_Impl &rParentContext ) : 188cdf0e10cSrcweir ConvDicXMLImportContext( rImport, nPrefix, rLName ), 189cdf0e10cSrcweir rEntryContext( rParentContext ) 190cdf0e10cSrcweir { 191cdf0e10cSrcweir } 192cdf0e10cSrcweir 193cdf0e10cSrcweir // SvXMLImportContext 194cdf0e10cSrcweir virtual void EndElement(); 195cdf0e10cSrcweir virtual SvXMLImportContext * CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const uno::Reference< xml::sax::XAttributeList > &rxAttrList ); 196cdf0e10cSrcweir virtual void Characters( const OUString &rChars ); 197cdf0e10cSrcweir 198cdf0e10cSrcweir const OUString & GetRightText() const { return aRightText; } 199cdf0e10cSrcweir const OUString & GetLeftText() const { return rEntryContext.GetLeftText(); } 200cdf0e10cSrcweir ConvDic * GetDic() { return GetConvDicImport().GetDic(); } 201cdf0e10cSrcweir }; 202cdf0e10cSrcweir 203cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////// 204cdf0e10cSrcweir 205cdf0e10cSrcweir void ConvDicXMLImportContext::Characters(const OUString & /*rChars*/) 206cdf0e10cSrcweir { 207cdf0e10cSrcweir /* 208cdf0e10cSrcweir Whitespace occurring within the content of token elements is "trimmed" 209cdf0e10cSrcweir from the ends (i.e. all whitespace at the beginning and end of the 210cdf0e10cSrcweir content is removed), and "collapsed" internally (i.e. each sequence of 211cdf0e10cSrcweir 1 or more whitespace characters is replaced with one blank character). 212cdf0e10cSrcweir */ 213cdf0e10cSrcweir //collapsing not done yet! 214cdf0e10cSrcweir 215cdf0e10cSrcweir // warning-free code: since the result is not used there is no need for trimming... 216cdf0e10cSrcweir //const OUString &rChars2 = rChars.trim(); 217cdf0e10cSrcweir } 218cdf0e10cSrcweir 219cdf0e10cSrcweir SvXMLImportContext * ConvDicXMLImportContext::CreateChildContext( 220cdf0e10cSrcweir sal_uInt16 nPrefix, const OUString& rLocalName, 221cdf0e10cSrcweir const uno::Reference< xml::sax::XAttributeList > & /*rxAttrList*/ ) 222cdf0e10cSrcweir { 223cdf0e10cSrcweir SvXMLImportContext *pContext = 0; 224cdf0e10cSrcweir if (nPrefix == XML_NAMESPACE_TCD && rLocalName.equalsAscii( "text-conversion-dictionary" )) 225cdf0e10cSrcweir pContext = new ConvDicXMLDictionaryContext_Impl( GetConvDicImport(), nPrefix, rLocalName ); 226cdf0e10cSrcweir else 227cdf0e10cSrcweir pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); 228cdf0e10cSrcweir return pContext; 229cdf0e10cSrcweir } 230cdf0e10cSrcweir 231cdf0e10cSrcweir //////////////////////////////////////// 232cdf0e10cSrcweir 233cdf0e10cSrcweir void ConvDicXMLDictionaryContext_Impl::StartElement( 234cdf0e10cSrcweir const uno::Reference< xml::sax::XAttributeList > &rxAttrList ) 235cdf0e10cSrcweir { 236cdf0e10cSrcweir sal_Int16 nAttrCount = rxAttrList.is() ? rxAttrList->getLength() : 0; 237cdf0e10cSrcweir for (sal_Int16 i = 0; i < nAttrCount; ++i) 238cdf0e10cSrcweir { 239cdf0e10cSrcweir OUString aAttrName = rxAttrList->getNameByIndex(i); 240cdf0e10cSrcweir OUString aLocalName; 241cdf0e10cSrcweir sal_uInt16 nPrefix = GetImport().GetNamespaceMap(). 242cdf0e10cSrcweir GetKeyByAttrName( aAttrName, &aLocalName ); 243cdf0e10cSrcweir OUString aValue = rxAttrList->getValueByIndex(i); 244cdf0e10cSrcweir 245cdf0e10cSrcweir if (nPrefix == XML_NAMESPACE_TCD && aLocalName.equalsAscii( "lang" )) 246cdf0e10cSrcweir nLanguage = MsLangId::convertIsoStringToLanguage( aValue ); 247cdf0e10cSrcweir else if (nPrefix == XML_NAMESPACE_TCD && aLocalName.equalsAscii( "conversion-type" )) 248cdf0e10cSrcweir nConversionType = GetConversionTypeFromText( aValue ); 249cdf0e10cSrcweir } 250cdf0e10cSrcweir GetConvDicImport().SetLanguage( nLanguage ); 251cdf0e10cSrcweir GetConvDicImport().SetConversionType( nConversionType ); 252cdf0e10cSrcweir 253cdf0e10cSrcweir //!! hack to stop the parser from reading the rest of the file !! 254cdf0e10cSrcweir //!! when only the header (language, conversion type) is needed !! 255cdf0e10cSrcweir // if (GetConvDicImport().GetDic() == 0) 256cdf0e10cSrcweir // throw uno::RuntimeException(); 257cdf0e10cSrcweir } 258cdf0e10cSrcweir 259cdf0e10cSrcweir SvXMLImportContext * ConvDicXMLDictionaryContext_Impl::CreateChildContext( 260cdf0e10cSrcweir sal_uInt16 nPrefix, const OUString& rLocalName, 261cdf0e10cSrcweir const uno::Reference< xml::sax::XAttributeList > & /*rxAttrList*/ ) 262cdf0e10cSrcweir { 263cdf0e10cSrcweir SvXMLImportContext *pContext = 0; 264cdf0e10cSrcweir if (nPrefix == XML_NAMESPACE_TCD && rLocalName.equalsAscii( "entry" )) 265cdf0e10cSrcweir pContext = new ConvDicXMLEntryTextContext_Impl( GetConvDicImport(), nPrefix, rLocalName, *this ); 266cdf0e10cSrcweir else 267cdf0e10cSrcweir pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); 268cdf0e10cSrcweir return pContext; 269cdf0e10cSrcweir } 270cdf0e10cSrcweir 271cdf0e10cSrcweir //////////////////////////////////////// 272cdf0e10cSrcweir 273cdf0e10cSrcweir SvXMLImportContext * ConvDicXMLEntryTextContext_Impl::CreateChildContext( 274cdf0e10cSrcweir sal_uInt16 nPrefix, const OUString& rLocalName, 275cdf0e10cSrcweir const uno::Reference< xml::sax::XAttributeList > & /*rxAttrList*/ ) 276cdf0e10cSrcweir { 277cdf0e10cSrcweir SvXMLImportContext *pContext = 0; 278cdf0e10cSrcweir if (nPrefix == XML_NAMESPACE_TCD && rLocalName.equalsAscii( "right-text" )) 279cdf0e10cSrcweir pContext = new ConvDicXMLRightTextContext_Impl( GetConvDicImport(), nPrefix, rLocalName, *this ); 280cdf0e10cSrcweir else 281cdf0e10cSrcweir pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); 282cdf0e10cSrcweir return pContext; 283cdf0e10cSrcweir } 284cdf0e10cSrcweir 285cdf0e10cSrcweir void ConvDicXMLEntryTextContext_Impl::StartElement( 286cdf0e10cSrcweir const uno::Reference< xml::sax::XAttributeList >& rxAttrList ) 287cdf0e10cSrcweir { 288cdf0e10cSrcweir sal_Int16 nAttrCount = rxAttrList.is() ? rxAttrList->getLength() : 0; 289cdf0e10cSrcweir for (sal_Int16 i = 0; i < nAttrCount; ++i) 290cdf0e10cSrcweir { 291cdf0e10cSrcweir OUString aAttrName = rxAttrList->getNameByIndex(i); 292cdf0e10cSrcweir OUString aLocalName; 293cdf0e10cSrcweir sal_uInt16 nPrefix = GetImport().GetNamespaceMap(). 294cdf0e10cSrcweir GetKeyByAttrName( aAttrName, &aLocalName ); 295cdf0e10cSrcweir OUString aValue = rxAttrList->getValueByIndex(i); 296cdf0e10cSrcweir 297cdf0e10cSrcweir if (nPrefix == XML_NAMESPACE_TCD && aLocalName.equalsAscii( "left-text" )) 298cdf0e10cSrcweir aLeftText = aValue; 299cdf0e10cSrcweir if (nPrefix == XML_NAMESPACE_TCD && aLocalName.equalsAscii( "property-type" )) 300cdf0e10cSrcweir nPropertyType = (sal_Int16) aValue.toInt32(); 301cdf0e10cSrcweir } 302cdf0e10cSrcweir } 303cdf0e10cSrcweir 304cdf0e10cSrcweir //////////////////////////////////////// 305cdf0e10cSrcweir 306cdf0e10cSrcweir SvXMLImportContext * ConvDicXMLRightTextContext_Impl::CreateChildContext( 307cdf0e10cSrcweir sal_uInt16 nPrefix, const OUString& rLocalName, 308cdf0e10cSrcweir const uno::Reference< xml::sax::XAttributeList > & /*rxAttrList*/ ) 309cdf0e10cSrcweir { 310cdf0e10cSrcweir // leaf: return default (empty) context 311cdf0e10cSrcweir SvXMLImportContext *pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); 312cdf0e10cSrcweir return pContext; 313cdf0e10cSrcweir } 314cdf0e10cSrcweir 315cdf0e10cSrcweir void ConvDicXMLRightTextContext_Impl::Characters( const OUString &rChars ) 316cdf0e10cSrcweir { 317cdf0e10cSrcweir aRightText += rChars; 318cdf0e10cSrcweir } 319cdf0e10cSrcweir 320cdf0e10cSrcweir void ConvDicXMLRightTextContext_Impl::EndElement() 321cdf0e10cSrcweir { 322cdf0e10cSrcweir ConvDic *pDic = GetDic(); 323cdf0e10cSrcweir if (pDic) 324cdf0e10cSrcweir pDic->AddEntry( GetLeftText(), GetRightText() ); 325cdf0e10cSrcweir } 326cdf0e10cSrcweir 327cdf0e10cSrcweir 328cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////// 329cdf0e10cSrcweir 330cdf0e10cSrcweir sal_Bool ConvDicXMLExport::Export() 331cdf0e10cSrcweir { 332cdf0e10cSrcweir sal_Bool bRet = sal_False; 333cdf0e10cSrcweir 334cdf0e10cSrcweir uno::Reference< document::XExporter > xExporter( this ); 335cdf0e10cSrcweir uno::Reference< document::XFilter > xFilter( xExporter, UNO_QUERY ); 336cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aProps(0); 337cdf0e10cSrcweir xFilter->filter( aProps ); // calls exportDoc implicitly 338cdf0e10cSrcweir 339cdf0e10cSrcweir return bRet = bSuccess; 340cdf0e10cSrcweir } 341cdf0e10cSrcweir 342cdf0e10cSrcweir 343cdf0e10cSrcweir sal_uInt32 ConvDicXMLExport::exportDoc( enum ::xmloff::token::XMLTokenEnum /*eClass*/ ) 344cdf0e10cSrcweir { 345cdf0e10cSrcweir _GetNamespaceMap().Add( A2OU( "tcd" ), 346cdf0e10cSrcweir A2OU( XML_NAMESPACE_TCD_STRING ), XML_NAMESPACE_TCD ); 347cdf0e10cSrcweir 348cdf0e10cSrcweir GetDocHandler()->startDocument(); 349cdf0e10cSrcweir 350cdf0e10cSrcweir // Add xmlns line and some other arguments 351cdf0e10cSrcweir AddAttribute( _GetNamespaceMap().GetAttrNameByKey( XML_NAMESPACE_TCD ), 352cdf0e10cSrcweir _GetNamespaceMap().GetNameByKey( XML_NAMESPACE_TCD ) ); 353cdf0e10cSrcweir AddAttributeASCII( XML_NAMESPACE_TCD, "package", "org.openoffice.Office" ); 354cdf0e10cSrcweir 355cdf0e10cSrcweir OUString aIsoLang( MsLangId::convertLanguageToIsoString( rDic.nLanguage ) ); 356cdf0e10cSrcweir AddAttribute( XML_NAMESPACE_TCD, "lang", aIsoLang ); 357cdf0e10cSrcweir OUString aConvType( ConversionTypeToText( rDic.nConversionType ) ); 358cdf0e10cSrcweir AddAttribute( XML_NAMESPACE_TCD, "conversion-type", aConvType ); 359cdf0e10cSrcweir 360cdf0e10cSrcweir //!! block necessary in order to have SvXMLElementExport d-tor called 361cdf0e10cSrcweir //!! before the call to endDocument 362cdf0e10cSrcweir { 363cdf0e10cSrcweir SvXMLElementExport aRoot( *this, XML_NAMESPACE_TCD, "text-conversion-dictionary", sal_True, sal_True ); 364cdf0e10cSrcweir _ExportContent(); 365cdf0e10cSrcweir } 366cdf0e10cSrcweir 367cdf0e10cSrcweir GetDocHandler()->endDocument(); 368cdf0e10cSrcweir 369cdf0e10cSrcweir bSuccess = sal_True; 370cdf0e10cSrcweir return 0; 371cdf0e10cSrcweir } 372cdf0e10cSrcweir 373cdf0e10cSrcweir 374cdf0e10cSrcweir void ConvDicXMLExport::_ExportContent() 375cdf0e10cSrcweir { 376cdf0e10cSrcweir // aquire sorted list of all keys 377cdf0e10cSrcweir ConvMapKeySet aKeySet; 378cdf0e10cSrcweir ConvMap::iterator aIt; 379cdf0e10cSrcweir for (aIt = rDic.aFromLeft.begin(); aIt != rDic.aFromLeft.end(); ++aIt) 380cdf0e10cSrcweir aKeySet.insert( (*aIt).first ); 381cdf0e10cSrcweir 382cdf0e10cSrcweir ConvMapKeySet::iterator aKeyIt; 383cdf0e10cSrcweir for (aKeyIt = aKeySet.begin(); aKeyIt != aKeySet.end(); ++aKeyIt) 384cdf0e10cSrcweir { 385cdf0e10cSrcweir OUString aLeftText( *aKeyIt ); 386cdf0e10cSrcweir AddAttribute( XML_NAMESPACE_TCD, "left-text", aLeftText ); 387cdf0e10cSrcweir if (rDic.pConvPropType.get()) // property-type list available? 388cdf0e10cSrcweir { 389cdf0e10cSrcweir sal_Int16 nPropertyType = -1; 390cdf0e10cSrcweir PropTypeMap::iterator aIt2 = rDic.pConvPropType->find( aLeftText ); 391cdf0e10cSrcweir if (aIt2 != rDic.pConvPropType->end()) 392cdf0e10cSrcweir nPropertyType = (*aIt2).second; 393cdf0e10cSrcweir DBG_ASSERT( nPropertyType, "property-type not found" ); 394cdf0e10cSrcweir if (nPropertyType == -1) 395cdf0e10cSrcweir nPropertyType = ConversionPropertyType::NOT_DEFINED; 396cdf0e10cSrcweir AddAttribute( XML_NAMESPACE_TCD, "property-type", OUString::valueOf( (sal_Int32) nPropertyType ) ); 397cdf0e10cSrcweir } 398cdf0e10cSrcweir SvXMLElementExport aEntryMain( *this, XML_NAMESPACE_TCD, 399cdf0e10cSrcweir "entry" , sal_True, sal_True ); 400cdf0e10cSrcweir 401cdf0e10cSrcweir pair< ConvMap::iterator, ConvMap::iterator > aRange = 402cdf0e10cSrcweir rDic.aFromLeft.equal_range( *aKeyIt ); 403cdf0e10cSrcweir for (aIt = aRange.first; aIt != aRange.second; ++aIt) 404cdf0e10cSrcweir { 405cdf0e10cSrcweir DBG_ASSERT( *aKeyIt == (*aIt).first, "key <-> entry mismatch" ); 406cdf0e10cSrcweir OUString aRightText( (*aIt).second ); 407cdf0e10cSrcweir SvXMLElementExport aEntryRightText( *this, XML_NAMESPACE_TCD, 408cdf0e10cSrcweir "right-text" , sal_True, sal_False ); 409cdf0e10cSrcweir Characters( aRightText ); 410cdf0e10cSrcweir } 411cdf0e10cSrcweir } 412cdf0e10cSrcweir } 413cdf0e10cSrcweir 414cdf0e10cSrcweir ::rtl::OUString SAL_CALL ConvDicXMLExport::getImplementationName() 415cdf0e10cSrcweir throw( uno::RuntimeException ) 416cdf0e10cSrcweir { 417cdf0e10cSrcweir return A2OU( "com.sun.star.lingu2.ConvDicXMLExport" ); 418cdf0e10cSrcweir } 419cdf0e10cSrcweir 420cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////// 421cdf0e10cSrcweir 422cdf0e10cSrcweir void SAL_CALL ConvDicXMLImport::startDocument(void) 423cdf0e10cSrcweir throw( xml::sax::SAXException, uno::RuntimeException ) 424cdf0e10cSrcweir { 425cdf0e10cSrcweir // register namespace at first possible opportunity 426cdf0e10cSrcweir GetNamespaceMap().Add( A2OU( "tcd" ), 427cdf0e10cSrcweir A2OU( XML_NAMESPACE_TCD_STRING ), XML_NAMESPACE_TCD ); 428cdf0e10cSrcweir SvXMLImport::startDocument(); 429cdf0e10cSrcweir } 430cdf0e10cSrcweir 431cdf0e10cSrcweir void SAL_CALL ConvDicXMLImport::endDocument(void) 432cdf0e10cSrcweir throw( xml::sax::SAXException, uno::RuntimeException ) 433cdf0e10cSrcweir { 434cdf0e10cSrcweir SvXMLImport::endDocument(); 435cdf0e10cSrcweir } 436cdf0e10cSrcweir 437cdf0e10cSrcweir SvXMLImportContext * ConvDicXMLImport::CreateContext( 438cdf0e10cSrcweir sal_uInt16 nPrefix, 439cdf0e10cSrcweir const rtl::OUString &rLocalName, 440cdf0e10cSrcweir const uno::Reference < xml::sax::XAttributeList > & /*rxAttrList*/ ) 441cdf0e10cSrcweir { 442cdf0e10cSrcweir SvXMLImportContext *pContext = 0; 443cdf0e10cSrcweir if (nPrefix == XML_NAMESPACE_TCD && rLocalName.equalsAscii( "text-conversion-dictionary" )) 444cdf0e10cSrcweir pContext = new ConvDicXMLDictionaryContext_Impl( *this, nPrefix, rLocalName ); 445cdf0e10cSrcweir else 446cdf0e10cSrcweir pContext = new SvXMLImportContext( *this, nPrefix, rLocalName ); 447cdf0e10cSrcweir return pContext; 448cdf0e10cSrcweir } 449cdf0e10cSrcweir 450cdf0e10cSrcweir 451cdf0e10cSrcweir OUString SAL_CALL ConvDicXMLImport::getImplementationName() 452cdf0e10cSrcweir throw( uno::RuntimeException ) 453cdf0e10cSrcweir { 454cdf0e10cSrcweir return A2OU( "com.sun.star.lingu2.ConvDicXMLImport" ); 455cdf0e10cSrcweir } 456cdf0e10cSrcweir 457cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////// 458cdf0e10cSrcweir 459