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 27 28 #include <com/sun/star/util/XStringSubstitution.hpp> 29 #include <xmloff/DocumentSettingsContext.hxx> 30 #include <xmloff/xmlimp.hxx> 31 #include <xmloff/xmltoken.hxx> 32 #include "xmloff/xmlnmspe.hxx" 33 #include <xmloff/nmspmap.hxx> 34 #include <xmloff/xmluconv.hxx> 35 #include <tools/debug.hxx> 36 37 #ifndef __SGI_STL_LIST 38 #include <list> 39 #endif 40 #include <com/sun/star/i18n/XForbiddenCharacters.hpp> 41 #include <com/sun/star/container/XIndexContainer.hpp> 42 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 43 #include <com/sun/star/formula/SymbolDescriptor.hpp> 44 #include <comphelper/processfactory.hxx> 45 #include <com/sun/star/util/DateTime.hpp> 46 #include <com/sun/star/document/XViewDataSupplier.hpp> 47 #include <com/sun/star/document/PrinterIndependentLayout.hpp> 48 #include <comphelper/configurationhelper.hxx> 49 #include <rtl/ustrbuf.hxx> 50 #include <xmlenums.hxx> 51 52 using namespace com::sun::star; 53 using namespace ::xmloff::token; 54 55 #define C2U(cChar) ::rtl::OUString::createFromAscii(cChar) 56 57 //------------------------------------------------------------------ 58 59 class XMLMyList 60 { 61 std::list<beans::PropertyValue> aProps; 62 sal_uInt32 nCount; 63 64 // #110680# 65 ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxServiceFactory; 66 67 public: 68 // #110680# 69 XMLMyList(const uno::Reference<lang::XMultiServiceFactory>& xServiceFactory); 70 ~XMLMyList(); 71 72 void push_back(beans::PropertyValue& aProp) { aProps.push_back(aProp); nCount++; } 73 uno::Sequence<beans::PropertyValue> GetSequence(); 74 uno::Reference<container::XNameContainer> GetNameContainer(); 75 uno::Reference<container::XIndexContainer> GetIndexContainer(); 76 }; 77 78 // #110680# 79 XMLMyList::XMLMyList(const uno::Reference<lang::XMultiServiceFactory>& xServiceFactory) 80 : nCount(0), 81 mxServiceFactory(xServiceFactory) 82 { 83 DBG_ASSERT( mxServiceFactory.is(), "got no service manager" ); 84 } 85 86 // #110680# 87 XMLMyList::~XMLMyList() 88 { 89 } 90 91 uno::Sequence<beans::PropertyValue> XMLMyList::GetSequence() 92 { 93 uno::Sequence<beans::PropertyValue> aSeq; 94 if(nCount) 95 { 96 DBG_ASSERT(nCount == aProps.size(), "wrong count of PropertyValue"); 97 aSeq.realloc(nCount); 98 beans::PropertyValue* pProps = aSeq.getArray(); 99 std::list<beans::PropertyValue>::iterator aItr = aProps.begin(); 100 while (aItr != aProps.end()) 101 { 102 *pProps = *aItr; 103 pProps++; 104 aItr++; 105 } 106 } 107 return aSeq; 108 } 109 110 uno::Reference<container::XNameContainer> XMLMyList::GetNameContainer() 111 { 112 uno::Reference<container::XNameContainer> xNameContainer; 113 114 // #110680# 115 // uno::Reference<lang::XMultiServiceFactory> xServiceFactory = comphelper::getProcessServiceFactory(); 116 // DBG_ASSERT( xServiceFactory.is(), "got no service manager" ); 117 118 if( mxServiceFactory.is() ) 119 { 120 rtl::OUString sName(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.NamedPropertyValues")); 121 xNameContainer = uno::Reference<container::XNameContainer>(mxServiceFactory->createInstance(sName), uno::UNO_QUERY); 122 if (xNameContainer.is()) 123 { 124 std::list<beans::PropertyValue>::iterator aItr = aProps.begin(); 125 while (aItr != aProps.end()) 126 { 127 xNameContainer->insertByName(aItr->Name, aItr->Value); 128 aItr++; 129 } 130 } 131 } 132 return xNameContainer; 133 } 134 135 uno::Reference<container::XIndexContainer> XMLMyList::GetIndexContainer() 136 { 137 uno::Reference<container::XIndexContainer> xIndexContainer; 138 // #110680# 139 // uno::Reference<lang::XMultiServiceFactory> xServiceFactory = comphelper::getProcessServiceFactory(); 140 // DBG_ASSERT( xServiceFactory.is(), "got no service manager" ); 141 142 if( mxServiceFactory.is() ) 143 { 144 rtl::OUString sName(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.IndexedPropertyValues")); 145 xIndexContainer = uno::Reference<container::XIndexContainer>(mxServiceFactory->createInstance(sName), uno::UNO_QUERY); 146 if (xIndexContainer.is()) 147 { 148 std::list<beans::PropertyValue>::iterator aItr = aProps.begin(); 149 sal_uInt32 i(0); 150 while (aItr != aProps.end()) 151 { 152 xIndexContainer->insertByIndex(i, aItr->Value); 153 aItr++; 154 i++; 155 } 156 } 157 } 158 return xIndexContainer; 159 } 160 161 //============================================================================= 162 163 class XMLConfigBaseContext : public SvXMLImportContext 164 { 165 protected: 166 XMLMyList maProps; 167 beans::PropertyValue maProp; 168 com::sun::star::uno::Any& mrAny; 169 XMLConfigBaseContext* mpBaseContext; 170 public: 171 XMLConfigBaseContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, 172 com::sun::star::uno::Any& rAny, 173 XMLConfigBaseContext* pBaseContext); 174 virtual ~XMLConfigBaseContext(); 175 176 void AddPropertyValue() { maProps.push_back(maProp); } 177 }; 178 179 //============================================================================= 180 181 class XMLConfigItemContext : public SvXMLImportContext 182 { 183 rtl::OUString msType; 184 rtl::OUString msValue; 185 uno::Sequence<sal_Int8> maDecoded; 186 com::sun::star::uno::Any& mrAny; 187 const rtl::OUString mrItemName; 188 XMLConfigBaseContext* mpBaseContext; 189 190 public: 191 XMLConfigItemContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, 192 const ::com::sun::star::uno::Reference< 193 ::com::sun::star::xml::sax::XAttributeList>& xAttrList, 194 com::sun::star::uno::Any& rAny, 195 const rtl::OUString& rItemName, 196 XMLConfigBaseContext* pBaseContext); 197 virtual ~XMLConfigItemContext(); 198 199 virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, 200 const rtl::OUString& rLocalName, 201 const ::com::sun::star::uno::Reference< 202 ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); 203 virtual void Characters( const ::rtl::OUString& rChars ); 204 205 virtual void EndElement(); 206 207 virtual void ManipulateConfigItem(); 208 }; 209 210 //============================================================================= 211 212 class XMLConfigItemSetContext : public XMLConfigBaseContext 213 { 214 public: 215 XMLConfigItemSetContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, 216 const ::com::sun::star::uno::Reference< 217 ::com::sun::star::xml::sax::XAttributeList>& xAttrList, 218 com::sun::star::uno::Any& rAny, 219 XMLConfigBaseContext* pBaseContext); 220 virtual ~XMLConfigItemSetContext(); 221 222 virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, 223 const rtl::OUString& rLocalName, 224 const ::com::sun::star::uno::Reference< 225 ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); 226 227 virtual void EndElement(); 228 }; 229 230 //============================================================================= 231 232 class XMLConfigItemMapNamedContext : public XMLConfigBaseContext 233 { 234 public: 235 XMLConfigItemMapNamedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, 236 const ::com::sun::star::uno::Reference< 237 ::com::sun::star::xml::sax::XAttributeList>& xAttrList, 238 com::sun::star::uno::Any& rAny, 239 XMLConfigBaseContext* pBaseContext); 240 virtual ~XMLConfigItemMapNamedContext(); 241 242 virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, 243 const rtl::OUString& rLocalName, 244 const ::com::sun::star::uno::Reference< 245 ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); 246 247 virtual void EndElement(); 248 }; 249 250 //============================================================================= 251 252 class XMLConfigItemMapIndexedContext : public XMLConfigBaseContext 253 { 254 private: 255 rtl::OUString maConfigItemName; 256 257 public: 258 XMLConfigItemMapIndexedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, 259 const rtl::OUString& rLName, 260 const ::com::sun::star::uno::Reference< 261 ::com::sun::star::xml::sax::XAttributeList>& xAttrList, 262 com::sun::star::uno::Any& rAny, 263 const rtl::OUString& rConfigItemName, 264 XMLConfigBaseContext* pBaseContext); 265 virtual ~XMLConfigItemMapIndexedContext(); 266 267 virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, 268 const rtl::OUString& rLocalName, 269 const ::com::sun::star::uno::Reference< 270 ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); 271 272 virtual void EndElement(); 273 }; 274 275 //============================================================================= 276 277 SvXMLImportContext *CreateSettingsContext(SvXMLImport& rImport, sal_uInt16 p_nPrefix, 278 const rtl::OUString& rLocalName, 279 const uno::Reference<xml::sax::XAttributeList>& xAttrList, 280 beans::PropertyValue& rProp, XMLConfigBaseContext* pBaseContext) 281 { 282 SvXMLImportContext *pContext = 0; 283 284 rProp.Name = rtl::OUString(); 285 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 286 for( sal_Int16 i=0; i < nAttrCount; i++ ) 287 { 288 rtl::OUString sAttrName = xAttrList->getNameByIndex( i ); 289 rtl::OUString aLocalName; 290 sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( 291 sAttrName, &aLocalName ); 292 rtl::OUString sValue = xAttrList->getValueByIndex( i ); 293 294 if (nPrefix == XML_NAMESPACE_CONFIG) 295 { 296 if (IsXMLToken(aLocalName, XML_NAME)) 297 rProp.Name = sValue; 298 } 299 } 300 301 if (p_nPrefix == XML_NAMESPACE_CONFIG) 302 { 303 if (IsXMLToken(rLocalName, XML_CONFIG_ITEM)) 304 pContext = new XMLConfigItemContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext); 305 else if((IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET)) || 306 (IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_ENTRY)) ) 307 pContext = new XMLConfigItemSetContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext); 308 else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_NAMED)) 309 pContext = new XMLConfigItemMapNamedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext); 310 else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_INDEXED)) 311 pContext = new XMLConfigItemMapIndexedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext); 312 } 313 314 if( !pContext ) 315 pContext = new SvXMLImportContext( rImport, p_nPrefix, rLocalName ); 316 317 return pContext; 318 } 319 320 //============================================================================= 321 namespace 322 { 323 struct SettingsGroup 324 { 325 ::rtl::OUString sGroupName; 326 uno::Any aSettings; 327 328 SettingsGroup() 329 :sGroupName() 330 ,aSettings() 331 { 332 } 333 334 SettingsGroup( const ::rtl::OUString& _rGroupName, const uno::Any& _rSettings ) 335 :sGroupName( _rGroupName ) 336 ,aSettings( _rSettings ) 337 { 338 } 339 }; 340 } 341 342 struct XMLDocumentSettingsContext_Data 343 { 344 com::sun::star::uno::Any aViewProps; 345 com::sun::star::uno::Any aConfigProps; 346 ::std::list< SettingsGroup > aDocSpecificSettings; 347 }; 348 349 //============================================================================= 350 351 XMLDocumentSettingsContext::XMLDocumentSettingsContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, 352 const uno::Reference<xml::sax::XAttributeList>& ) 353 : SvXMLImportContext( rImport, nPrfx, rLName ) 354 , m_pData( new XMLDocumentSettingsContext_Data ) 355 { 356 // here are no attributes 357 } 358 359 XMLDocumentSettingsContext::~XMLDocumentSettingsContext() 360 { 361 } 362 363 SvXMLImportContext *XMLDocumentSettingsContext::CreateChildContext( sal_uInt16 p_nPrefix, 364 const rtl::OUString& rLocalName, 365 const ::com::sun::star::uno::Reference< 366 ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) 367 { 368 SvXMLImportContext *pContext = 0; 369 rtl::OUString sName; 370 371 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 372 for( sal_Int16 i=0; i < nAttrCount; i++ ) 373 { 374 rtl::OUString sAttrName = xAttrList->getNameByIndex( i ); 375 rtl::OUString aLocalName; 376 sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( 377 sAttrName, &aLocalName ); 378 rtl::OUString sValue = xAttrList->getValueByIndex( i ); 379 380 if (nPrefix == XML_NAMESPACE_CONFIG) 381 { 382 if (IsXMLToken(aLocalName, XML_NAME)) 383 sName = sValue; 384 } 385 } 386 387 if (p_nPrefix == XML_NAMESPACE_CONFIG) 388 { 389 if (IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET)) 390 { 391 ::rtl::OUString aLocalConfigName; 392 sal_uInt16 nConfigPrefix = 393 GetImport().GetNamespaceMap().GetKeyByAttrName( 394 sName, &aLocalConfigName ); 395 396 if( XML_NAMESPACE_OOO == nConfigPrefix ) 397 { 398 if (IsXMLToken(aLocalConfigName, XML_VIEW_SETTINGS)) 399 pContext = new XMLConfigItemSetContext(GetImport(), 400 p_nPrefix, rLocalName, xAttrList, 401 m_pData->aViewProps, NULL); 402 else if (IsXMLToken(aLocalConfigName, 403 XML_CONFIGURATION_SETTINGS)) 404 pContext = new XMLConfigItemSetContext(GetImport(), 405 p_nPrefix, rLocalName, xAttrList, 406 m_pData->aConfigProps, NULL); 407 else 408 { 409 m_pData->aDocSpecificSettings.push_back( SettingsGroup( aLocalConfigName, uno::Any() ) ); 410 411 ::std::list< SettingsGroup >::reverse_iterator settingsPos = 412 m_pData->aDocSpecificSettings.rbegin(); 413 414 pContext = new XMLConfigItemSetContext(GetImport(), 415 p_nPrefix, rLocalName, xAttrList, 416 settingsPos->aSettings, NULL); 417 } 418 } 419 } 420 } 421 422 if( !pContext ) 423 pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName ); 424 425 return pContext; 426 } 427 428 void XMLDocumentSettingsContext::EndElement() 429 { 430 uno::Sequence<beans::PropertyValue> aSeqViewProps; 431 if (m_pData->aViewProps >>= aSeqViewProps) 432 { 433 GetImport().SetViewSettings(aSeqViewProps); 434 sal_Int32 i(aSeqViewProps.getLength() - 1); 435 sal_Bool bFound(sal_False); 436 while((i >= 0) && !bFound) 437 { 438 if (aSeqViewProps[i].Name.compareToAscii("Views") == 0) 439 { 440 bFound = sal_True; 441 uno::Reference<container::XIndexAccess> xIndexAccess; 442 if (aSeqViewProps[i].Value >>= xIndexAccess) 443 { 444 uno::Reference<document::XViewDataSupplier> xViewDataSupplier(GetImport().GetModel(), uno::UNO_QUERY); 445 if (xViewDataSupplier.is()) 446 xViewDataSupplier->setViewData(xIndexAccess); 447 } 448 } 449 else 450 i--; 451 } 452 } 453 454 sal_Bool bLoadDocPrinter( sal_True ); 455 ::comphelper::ConfigurationHelper::readDirectKey( 456 ::comphelper::getProcessServiceFactory(), 457 C2U("org.openoffice.Office.Common/"), C2U("Save/Document"), C2U("LoadPrinter"), 458 ::comphelper::ConfigurationHelper::E_READONLY ) >>= bLoadDocPrinter; 459 uno::Sequence<beans::PropertyValue> aSeqConfigProps; 460 if ( m_pData->aConfigProps >>= aSeqConfigProps ) 461 { 462 if ( !bLoadDocPrinter ) 463 { 464 sal_Int32 i = aSeqConfigProps.getLength() - 1; 465 int nFound = 0; 466 467 while ( ( i >= 0 ) && nFound < 2 ) 468 { 469 rtl::OUString sProp( aSeqConfigProps[i].Name ); 470 471 if ( sProp.compareToAscii("PrinterName") == 0 ) 472 { 473 rtl::OUString sEmpty; 474 aSeqConfigProps[i].Value = uno::makeAny( sEmpty ); 475 nFound++; 476 } 477 else if ( sProp.compareToAscii("PrinterSetup") == 0 ) 478 { 479 uno::Sequence< sal_Int8 > aEmpty; 480 aSeqConfigProps[i].Value = uno::makeAny( aEmpty ); 481 nFound++; 482 } 483 484 i--; 485 } 486 } 487 488 GetImport().SetConfigurationSettings( aSeqConfigProps ); 489 } 490 491 for ( ::std::list< SettingsGroup >::const_iterator settings = m_pData->aDocSpecificSettings.begin(); 492 settings != m_pData->aDocSpecificSettings.end(); 493 ++settings 494 ) 495 { 496 uno::Sequence< beans::PropertyValue > aDocSettings; 497 OSL_VERIFY( settings->aSettings >>= aDocSettings ); 498 GetImport().SetDocumentSpecificSettings( settings->sGroupName, aDocSettings ); 499 } 500 } 501 502 //============================================================================= 503 504 XMLConfigBaseContext::XMLConfigBaseContext(SvXMLImport& rImport, sal_uInt16 nPrfx, 505 const rtl::OUString& rLName, com::sun::star::uno::Any& rTempAny, 506 XMLConfigBaseContext* pTempBaseContext) 507 : SvXMLImportContext( rImport, nPrfx, rLName ), 508 // #110680# 509 maProps(rImport.getServiceFactory()), 510 maProp(), 511 mrAny(rTempAny), 512 mpBaseContext(pTempBaseContext) 513 { 514 } 515 516 XMLConfigBaseContext::~XMLConfigBaseContext() 517 { 518 } 519 520 //============================================================================= 521 522 XMLConfigItemSetContext::XMLConfigItemSetContext(SvXMLImport& rImport, sal_uInt16 nPrfx, 523 const rtl::OUString& rLName, 524 const ::com::sun::star::uno::Reference< 525 ::com::sun::star::xml::sax::XAttributeList>&, 526 com::sun::star::uno::Any& rAny, 527 XMLConfigBaseContext* pBaseContext) 528 : XMLConfigBaseContext( rImport, nPrfx, rLName, rAny, pBaseContext ) 529 { 530 // here are no attributes 531 } 532 533 XMLConfigItemSetContext::~XMLConfigItemSetContext() 534 { 535 } 536 537 SvXMLImportContext *XMLConfigItemSetContext::CreateChildContext( sal_uInt16 nPrefix, 538 const rtl::OUString& rLocalName, 539 const ::com::sun::star::uno::Reference< 540 ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) 541 { 542 return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this); 543 } 544 545 void XMLConfigItemSetContext::EndElement() 546 { 547 mrAny <<= maProps.GetSequence(); 548 if (mpBaseContext) 549 mpBaseContext->AddPropertyValue(); 550 } 551 552 //============================================================================= 553 554 XMLConfigItemContext::XMLConfigItemContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, 555 const ::com::sun::star::uno::Reference< 556 ::com::sun::star::xml::sax::XAttributeList>& xAttrList, 557 com::sun::star::uno::Any& rTempAny, 558 const rtl::OUString& rTempItemName, 559 XMLConfigBaseContext* pTempBaseContext) 560 : SvXMLImportContext(rImport, nPrfx, rLName), 561 mrAny(rTempAny), 562 mrItemName(rTempItemName), 563 mpBaseContext(pTempBaseContext) 564 { 565 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 566 for( sal_Int16 i=0; i < nAttrCount; i++ ) 567 { 568 rtl::OUString sAttrName = xAttrList->getNameByIndex( i ); 569 rtl::OUString aLocalName; 570 sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( 571 sAttrName, &aLocalName ); 572 rtl::OUString sValue = xAttrList->getValueByIndex( i ); 573 574 if (nPrefix == XML_NAMESPACE_CONFIG) 575 { 576 if (IsXMLToken(aLocalName, XML_TYPE)) 577 msType = sValue; 578 } 579 } 580 } 581 582 XMLConfigItemContext::~XMLConfigItemContext() 583 { 584 } 585 586 SvXMLImportContext *XMLConfigItemContext::CreateChildContext( sal_uInt16 nPrefix, 587 const rtl::OUString& rLocalName, 588 const ::com::sun::star::uno::Reference< 589 ::com::sun::star::xml::sax::XAttributeList>& ) 590 { 591 SvXMLImportContext* pContext = new SvXMLImportContext(GetImport(), nPrefix, rLocalName); 592 return pContext; 593 } 594 595 void XMLConfigItemContext::Characters( const ::rtl::OUString& rChars ) 596 { 597 if (IsXMLToken(msType, XML_BASE64BINARY)) 598 { 599 rtl::OUString sTrimmedChars( rChars.trim() ); 600 if( sTrimmedChars.getLength() ) 601 { 602 rtl::OUString sChars; 603 if( msValue ) 604 { 605 sChars = msValue; 606 sChars += sTrimmedChars; 607 msValue = rtl::OUString(); 608 } 609 else 610 { 611 sChars = sTrimmedChars; 612 } 613 uno::Sequence<sal_Int8> aBuffer((sChars.getLength() / 4) * 3 ); 614 sal_Int32 nCharsDecoded = 615 GetImport().GetMM100UnitConverter(). 616 decodeBase64SomeChars( aBuffer, sChars ); 617 sal_uInt32 nStartPos(maDecoded.getLength()); 618 sal_uInt32 nCount(aBuffer.getLength()); 619 maDecoded.realloc(nStartPos + nCount); 620 sal_Int8* pDecoded = maDecoded.getArray(); 621 sal_Int8* pBuffer = aBuffer.getArray(); 622 for (sal_uInt32 i = 0; i < nCount; i++, pBuffer++) 623 pDecoded[nStartPos + i] = *pBuffer; 624 if( nCharsDecoded != sChars.getLength() ) 625 msValue = sChars.copy( nCharsDecoded ); 626 } 627 } 628 else 629 msValue += rChars; 630 } 631 632 633 void XMLConfigItemContext::EndElement() 634 { 635 if (mpBaseContext) 636 { 637 if (IsXMLToken(msType, XML_BOOLEAN)) 638 { 639 sal_Bool bValue(sal_False); 640 if (IsXMLToken(msValue, XML_TRUE)) 641 bValue = sal_True; 642 mrAny <<= bValue; 643 } 644 else if (IsXMLToken(msType, XML_BYTE)) 645 { 646 sal_Int32 nValue(0); 647 SvXMLUnitConverter::convertNumber(nValue, msValue); 648 mrAny <<= static_cast<sal_Int8>(nValue); 649 } 650 else if (IsXMLToken(msType, XML_SHORT)) 651 { 652 sal_Int32 nValue(0); 653 SvXMLUnitConverter::convertNumber(nValue, msValue); 654 mrAny <<= static_cast<sal_Int16>(nValue); 655 } 656 else if (IsXMLToken(msType, XML_INT)) 657 { 658 sal_Int32 nValue(0); 659 SvXMLUnitConverter::convertNumber(nValue, msValue); 660 mrAny <<= nValue; 661 } 662 else if (IsXMLToken(msType, XML_LONG)) 663 { 664 sal_Int64 nValue(msValue.toInt64()); 665 mrAny <<= nValue; 666 } 667 else if (IsXMLToken(msType, XML_DOUBLE)) 668 { 669 double fValue(0.0); 670 SvXMLUnitConverter::convertDouble(fValue, msValue); 671 mrAny <<= fValue; 672 } 673 else if (IsXMLToken(msType, XML_STRING)) 674 { 675 mrAny <<= msValue; 676 } 677 else if (IsXMLToken(msType, XML_DATETIME)) 678 { 679 util::DateTime aDateTime; 680 SvXMLUnitConverter::convertDateTime(aDateTime, msValue); 681 mrAny <<= aDateTime; 682 } 683 else if (IsXMLToken(msType, XML_BASE64BINARY)) 684 { 685 mrAny <<= maDecoded; 686 } 687 else { 688 DBG_ERROR("wrong type"); 689 } 690 691 ManipulateConfigItem(); 692 693 mpBaseContext->AddPropertyValue(); 694 } 695 else { 696 DBG_ERROR("no BaseContext"); 697 } 698 } 699 700 /** There are some instances where there is a mismatch between API and 701 * XML mapping of a setting. In this case, this method allows us to 702 * manipulate the values accordingly. */ 703 void XMLConfigItemContext::ManipulateConfigItem() 704 { 705 if( mrItemName.equalsAsciiL( 706 RTL_CONSTASCII_STRINGPARAM( "PrinterIndependentLayout" ) ) ) 707 { 708 rtl::OUString sValue; 709 mrAny >>= sValue; 710 711 sal_Int16 nTmp = document::PrinterIndependentLayout::HIGH_RESOLUTION; 712 713 if( sValue.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("enabled")) || 714 sValue.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("low-resolution")) ) 715 { 716 nTmp = document::PrinterIndependentLayout::LOW_RESOLUTION; 717 } 718 else if( sValue.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("disabled")) ) 719 { 720 nTmp = document::PrinterIndependentLayout::DISABLED; 721 } 722 // else: default to high_resolution 723 724 mrAny <<= nTmp; 725 } 726 else if( (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ColorTableURL" ) ) ) || 727 (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "LineEndTableURL" ) ) ) || 728 (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HatchTableURL" ) ) ) || 729 (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "DashTableURL" ) ) ) || 730 (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "GradientTableURL") ) ) || 731 (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BitmapTableURL" ) ) ) ) 732 { 733 if( GetImport().getServiceFactory().is() ) try 734 { 735 uno::Reference< util::XStringSubstitution > xStringSubsitution( 736 GetImport().getServiceFactory()-> 737 createInstance(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.PathSubstitution" ) ) ), uno::UNO_QUERY ); 738 739 if( xStringSubsitution.is() ) 740 { 741 rtl::OUString aURL; 742 mrAny >>= aURL; 743 aURL = xStringSubsitution->substituteVariables( aURL, sal_False ); 744 mrAny <<= aURL; 745 } 746 } 747 catch( uno::Exception& ) 748 { 749 } 750 } 751 } 752 753 754 //============================================================================= 755 756 XMLConfigItemMapNamedContext::XMLConfigItemMapNamedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, 757 const ::com::sun::star::uno::Reference< 758 ::com::sun::star::xml::sax::XAttributeList>&, 759 com::sun::star::uno::Any& rAny, 760 XMLConfigBaseContext* pBaseContext) 761 : XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext) 762 { 763 } 764 765 XMLConfigItemMapNamedContext::~XMLConfigItemMapNamedContext() 766 { 767 } 768 769 SvXMLImportContext *XMLConfigItemMapNamedContext::CreateChildContext( sal_uInt16 nPrefix, 770 const rtl::OUString& rLocalName, 771 const ::com::sun::star::uno::Reference< 772 ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) 773 { 774 return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this); 775 } 776 777 void XMLConfigItemMapNamedContext::EndElement() 778 { 779 if (mpBaseContext) 780 { 781 mrAny <<= maProps.GetNameContainer(); 782 mpBaseContext->AddPropertyValue(); 783 } 784 else { 785 DBG_ERROR("no BaseContext"); 786 } 787 } 788 789 //============================================================================= 790 791 XMLConfigItemMapIndexedContext::XMLConfigItemMapIndexedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, 792 const rtl::OUString& rLName, 793 const ::com::sun::star::uno::Reference< 794 ::com::sun::star::xml::sax::XAttributeList>&, 795 com::sun::star::uno::Any& rAny, 796 const ::rtl::OUString& rConfigItemName, 797 XMLConfigBaseContext* pBaseContext) 798 : XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext), 799 maConfigItemName( rConfigItemName ) 800 { 801 } 802 803 XMLConfigItemMapIndexedContext::~XMLConfigItemMapIndexedContext() 804 { 805 } 806 807 SvXMLImportContext *XMLConfigItemMapIndexedContext::CreateChildContext( sal_uInt16 nPrefix, 808 const rtl::OUString& rLocalName, 809 const ::com::sun::star::uno::Reference< 810 ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) 811 { 812 return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this); 813 } 814 815 void XMLConfigItemMapIndexedContext::EndElement() 816 { 817 if (mpBaseContext) 818 { 819 if( maConfigItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ForbiddenCharacters" ) ) ) 820 { 821 uno::Reference< i18n::XForbiddenCharacters > xForbChars; 822 823 // get the forbidden characters from the document 824 uno::Reference< lang::XMultiServiceFactory > xFac( GetImport().GetModel(), uno::UNO_QUERY ); 825 if( xFac.is() ) 826 { 827 uno::Reference< beans::XPropertySet > xProps( xFac->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.Settings" ) ) ), uno::UNO_QUERY ); 828 if( xProps.is() && xProps->getPropertySetInfo()->hasPropertyByName( maConfigItemName ) ) 829 { 830 xProps->getPropertyValue( maConfigItemName ) >>= xForbChars; 831 } 832 } 833 834 if( xForbChars.is() ) 835 { 836 837 uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY ); 838 839 const sal_Int32 nCount = xIndex->getCount(); 840 uno::Sequence < beans::PropertyValue > aProps; 841 for (sal_Int32 i = 0; i < nCount; i++) 842 { 843 if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_FORBIDDEN_CHARACTER_MAX ) ) 844 { 845 beans::PropertyValue *pForChar = aProps.getArray(); 846 i18n::ForbiddenCharacters aForbid; 847 lang::Locale aLocale; 848 const rtl::OUString sLanguage ( RTL_CONSTASCII_USTRINGPARAM ( "Language" ) ); 849 const rtl::OUString sCountry ( RTL_CONSTASCII_USTRINGPARAM ( "Country" ) ); 850 const rtl::OUString sVariant ( RTL_CONSTASCII_USTRINGPARAM ( "Variant" ) ); 851 const rtl::OUString sBeginLine ( RTL_CONSTASCII_USTRINGPARAM ( "BeginLine" ) ); 852 const rtl::OUString sEndLine ( RTL_CONSTASCII_USTRINGPARAM ( "EndLine" ) ); 853 sal_Bool bHaveLanguage = sal_False, bHaveCountry = sal_False, bHaveVariant = sal_False, 854 bHaveBegin = sal_False, bHaveEnd = sal_False; 855 856 for ( sal_Int32 j = 0 ; j < XML_FORBIDDEN_CHARACTER_MAX ; j++ ) 857 { 858 if (pForChar->Name.equals (sLanguage ) ) 859 { 860 pForChar->Value >>= aLocale.Language; 861 bHaveLanguage = sal_True; 862 } 863 else if (pForChar->Name.equals (sCountry ) ) 864 { 865 pForChar->Value >>= aLocale.Country; 866 bHaveCountry = sal_True; 867 } 868 else if (pForChar->Name.equals (sVariant ) ) 869 { 870 pForChar->Value >>= aLocale.Variant; 871 bHaveVariant = sal_True; 872 } 873 else if (pForChar->Name.equals (sBeginLine ) ) 874 { 875 pForChar->Value >>= aForbid.beginLine; 876 bHaveBegin = sal_True; 877 } 878 else if (pForChar->Name.equals (sEndLine ) ) 879 { 880 pForChar->Value >>= aForbid.endLine; 881 bHaveEnd = sal_True; 882 } 883 pForChar++; 884 } 885 886 if ( bHaveLanguage && bHaveCountry && bHaveVariant && bHaveBegin && bHaveEnd ) 887 { 888 try 889 { 890 xForbChars->setForbiddenCharacters( aLocale, aForbid ); 891 } 892 catch( uno::Exception& ) 893 { 894 DBG_ERROR( "Exception while importing forbidden characters" ); 895 } 896 } 897 } 898 } 899 } 900 else 901 { 902 DBG_ERROR( "could not get the XForbiddenCharacters from document!" ); 903 mrAny <<= maProps.GetIndexContainer(); 904 } 905 } 906 else if( maConfigItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Symbols" ) ) ) 907 { 908 uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY ); 909 910 const sal_Int32 nCount = xIndex->getCount(); 911 uno::Sequence < beans::PropertyValue > aProps; 912 uno::Sequence < formula::SymbolDescriptor > aSymbolList ( nCount ); 913 914 formula::SymbolDescriptor *pDescriptor = aSymbolList.getArray(); 915 916 const rtl::OUString sName ( RTL_CONSTASCII_USTRINGPARAM ( "Name" ) ); 917 const rtl::OUString sExportName ( RTL_CONSTASCII_USTRINGPARAM ( "ExportName" ) ); 918 const rtl::OUString sFontName ( RTL_CONSTASCII_USTRINGPARAM ( "FontName" ) ); 919 const rtl::OUString sSymbolSet ( RTL_CONSTASCII_USTRINGPARAM ( "SymbolSet" ) ); 920 const rtl::OUString sCharacter ( RTL_CONSTASCII_USTRINGPARAM ( "Character" ) ); 921 const rtl::OUString sCharSet ( RTL_CONSTASCII_USTRINGPARAM ( "CharSet" ) ); 922 const rtl::OUString sFamily ( RTL_CONSTASCII_USTRINGPARAM ( "Family" ) ); 923 const rtl::OUString sPitch ( RTL_CONSTASCII_USTRINGPARAM ( "Pitch" ) ); 924 const rtl::OUString sWeight ( RTL_CONSTASCII_USTRINGPARAM ( "Weight" ) ); 925 const rtl::OUString sItalic ( RTL_CONSTASCII_USTRINGPARAM ( "Italic" ) ); 926 sal_Int16 nNumFullEntries = 0; 927 928 for ( sal_Int32 i = 0; i < nCount; i++ ) 929 { 930 if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_SYMBOL_DESCRIPTOR_MAX ) ) 931 { 932 sal_Bool bHaveName = sal_False, bHaveExportName = sal_False, bHaveCharSet = sal_False, 933 bHaveFontName = sal_False, bHaveFamily = sal_False, bHavePitch = sal_False, 934 bHaveWeight = sal_False, bHaveItalic = sal_False, bHaveSymbolSet = sal_False, 935 bHaveCharacter = sal_False; 936 beans::PropertyValue *pSymbol = aProps.getArray(); 937 938 for ( sal_Int32 j = 0 ; j < XML_SYMBOL_DESCRIPTOR_MAX ; j++ ) 939 { 940 if (pSymbol->Name.equals ( sName ) ) 941 { 942 pSymbol->Value >>= pDescriptor[nNumFullEntries].sName; 943 bHaveName = sal_True; 944 } 945 else if (pSymbol->Name.equals (sExportName ) ) 946 { 947 pSymbol->Value >>= pDescriptor[nNumFullEntries].sExportName; 948 bHaveExportName = sal_True; 949 } 950 else if (pSymbol->Name.equals (sFontName ) ) 951 { 952 pSymbol->Value >>= pDescriptor[nNumFullEntries].sFontName; 953 bHaveFontName = sal_True; 954 } 955 else if (pSymbol->Name.equals (sCharSet ) ) 956 { 957 pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharSet; 958 bHaveCharSet = sal_True; 959 } 960 else if (pSymbol->Name.equals (sFamily ) ) 961 { 962 pSymbol->Value >>= pDescriptor[nNumFullEntries].nFamily; 963 bHaveFamily = sal_True; 964 } 965 else if (pSymbol->Name.equals (sPitch ) ) 966 { 967 pSymbol->Value >>= pDescriptor[nNumFullEntries].nPitch; 968 bHavePitch = sal_True; 969 } 970 else if (pSymbol->Name.equals (sWeight ) ) 971 { 972 pSymbol->Value >>= pDescriptor[nNumFullEntries].nWeight; 973 bHaveWeight = sal_True; 974 } 975 else if (pSymbol->Name.equals (sItalic ) ) 976 { 977 pSymbol->Value >>= pDescriptor[nNumFullEntries].nItalic; 978 bHaveItalic = sal_True; 979 } 980 else if (pSymbol->Name.equals (sSymbolSet ) ) 981 { 982 pSymbol->Value >>= pDescriptor[nNumFullEntries].sSymbolSet; 983 bHaveSymbolSet = sal_True; 984 } 985 else if (pSymbol->Name.equals (sCharacter ) ) 986 { 987 pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharacter; 988 bHaveCharacter = sal_True; 989 } 990 pSymbol++; 991 } 992 if ( bHaveName && bHaveExportName && bHaveCharSet && bHaveFontName && bHaveCharacter 993 && bHaveFamily && bHavePitch && bHaveWeight && bHaveItalic && bHaveSymbolSet) 994 nNumFullEntries++; 995 } 996 } 997 aSymbolList.realloc (nNumFullEntries); 998 mrAny <<= aSymbolList; 999 } 1000 else 1001 { 1002 mrAny <<= maProps.GetIndexContainer(); 1003 } 1004 mpBaseContext->AddPropertyValue(); 1005 } 1006 else { 1007 DBG_ERROR("no BaseContext"); 1008 } 1009 } 1010 1011